这个题目要求的是:假定输入一行字符串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<<"请输入数据(!结束)"< 以上内容就是针对该问题的解决方法。希望对热爱学习的你能够有帮助!喜欢就点个赞呗!



