栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

输入一行字符串,输入错误时可以用#和@符号进行修改其中#为退格符号,@为退行符号,要求输出修正后的字符串(用栈来实现)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

输入一行字符串,输入错误时可以用#和@符号进行修改其中#为退格符号,@为退行符号,要求输出修正后的字符串(用栈来实现)

这个题目要求的是:假定输入一行字符串ABCii##DEF,输出结果想必大家心中已经有答案了,就是ABCDEF;假定输入一行字符串HAHA@Haaa,输出结果为Haaa。那么如何解决这个问题呢?

这就涉及到如何选择字符串的存储结构了,你可以用数组、线性表、链表、或者队列来存取一段字符串。但对于这道题目我们选择用栈来存储字符串。为什么选择栈作为存储结构呢?

首先我们先看看栈的定义:只允许在一端进行插入或删除操作的线性表。

首先,栈是一种线性表,但限定这种线性表只能在某一段进行插入和删除操作。

栈顶(Top):线性表允许进行插入和删除的一端。

栈底(Bottom):固定的,不允许进行插入和删除的另一端。

它有两种最常用的操作:

出栈:将栈顶元素删除,原栈顶元素下面第一个元素作为新的栈顶元素

入栈:将新元素存入栈中,作为新栈顶元素

当我们输入一段字符串ABCDE时,我们紧接着输入#后,E就会被删除(当然#也要删除),E是最后输入的字符(除#外),它在#前面且离#最近,而D、C、B、A,它们与#的距离是由近到远,意思是说先输入的反而更离#更远,我们可以用“后来居上”这个词语来解释:

当输入ABCDE时,按照一行一个字符来存入:

E------栈顶(最后进栈元素)

D

B

C

A------栈底(第1个进栈元素)

由此可见,当我们接着输入#时,我们是想要把E删除,这个操作就=="出栈".

因此们就用栈来作为字符串的存储结构。

接着,我们就来看看如何用代码来实现这个功能吧

以下代码我都有注释,对于栈的操作还是挺简单的,希望大家能够自己动手敲一遍,加深印象!



#include 
#include
#include
#include
#include
#include
#define MAXSIZE 10
using namespace std;
typedef char elemtype;
typedef struct stack//栈的结构体
{
    int capacity ;//栈的容量
    int top;//栈顶
    elemtype *base;//用指针作为数组:开创一个地址,指针指向其首地址
} Stack;
void initstack(Stack*s)//对栈进行初始化
{
    s->base = (elemtype*)malloc(sizeof(elemtype)*MAXSIZE);
    assert(s->base != NULL);//断言其是否成功分配空间
    s->capacity =MAXSIZE;//容量10个
    s->top=0;//空栈。
}
void popstack(Stack*s)//出栈函数,相当于#
{
    s->top--;
}
void clearstack(Stack*s)//清空栈,相当于@
{
    s->top=0;
}
void pushstack(Stack*s,elemtype x)
{
    s->base[s->top++]=x;//进栈,然后top++;保持top指向栈顶
}
void showstack(Stack*s)//打印函数
{
    cout<<"输入的数据为:"<top; i++)
    {
        cout<base[i];
    }
    cout<<"n";
}
int main()
{
    Stack S;//定义一个栈S
    initstack(&S);
    char ch;
    cout<<"请输入数据(!结束)"< 

以上内容就是针对该问题的解决方法。希望对热爱学习的你能够有帮助!喜欢就点个赞呗!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/926151.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号