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

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

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

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

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

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

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

它有两种最常用的操作:

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

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

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

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

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

D

B

C

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

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

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

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

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

/*任务:
输入一行字符串,用户在输入错误是可以用#和@符号进行修改
其中#为退格符号,@为退行符号,要求输出修正后的字符串
要求用栈作为存储结构实现*/


#include <iostream>
#include<assert.h>
#include<malloc.h>
#include<string.h>
#include<stdio.h>
#include<cstring>
#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<<"输入的数据为:"<<endl;
    for(int i=0; i<s->top; i++)
    {
        cout<<s->base[i];
    }
    cout<<"\n";
}
int main()
{
    Stack S;//定义一个栈S
    initstack(&S);
    char ch;
    cout<<"请输入数据(!结束)"<<endl;//这里我们用!作为输入结束的标志
    ch=getchar();//输入一个字符
    while(ch!='!')
    {
        switch(ch)
        {
        case '#':
            popstack(&S);//#,出栈一个元素
            break;
        case '@':
            clearstack(&S);//@,清空栈
            break;
        default:
            pushstack(&S,ch);
        }
        ch=getchar();//继续输入字符
    }
    showstack(&S);
    return 0;
}

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

猜你喜欢

转载自blog.csdn.net/weixin_46713492/article/details/124902839