栈的链式存储结构与操作 题目编号:458

请你定义一个链栈,可以对链栈进行 “将某个元素入栈”、“弹出栈顶元素”、“取栈顶元素(不删除)”、“判断栈是否为空”、
“清空栈”等操作。键盘输入一些命令,可以执行上述操作。本题中,栈的元素为字符。

输入描述
各个命令以及相关数据的输入格式如下: 将某个元素入栈:P,接下来一行是要入栈的元素 弹出栈顶元素:D 取栈顶元素(不删除):G 清空栈:T 判断栈是否为空操作:Y 当输入的命令为E时,程序结束
输出描述
当输入的命令为Y时,请输出栈是否为空,如果栈为空输出Yes,栈不空输出No。 当输入命令G时,输出取出的栈顶元素 当输入命令D时,输出弹出的栈顶元素 注意,如果没有满足的元素,请输出None,所有元素均占一行。
输入样例

P
a
P
b
P
c
D
Y
T
D
Y
P
1
P
2
D
E

输出样例

c
No
None
Yes
2
#include <iostream>
using namespace std;
struct Node{
    char data;
    Node* next;
};
class LinkStack {
public:
    LinkStack() { top = NULL; };//无参构造函数
    ~LinkStack() { if (top != NULL)this->Pop(); };//析构函数
    void Push(char x);//入栈操作
    char Pop();//出栈操作,删除
    char GetTop();//取栈顶元素1不删除
    string Empty();//判断栈是否为空
    void Clear();//清空栈
private:
    Node *top;//栈顶指针--->链栈头指针
};
void LinkStack::Push(char x) {
    Node* s= new Node;
    s->data = x;
    s->next = top;
    top = s;
}
char LinkStack::Pop() {
    if(top==NULL)throw"None";//实质为下溢,题目要求输出None
    char x=top->data;//存栈顶元素
    Node* p=top;
    top=top->next;//指向下一个结点
    delete p;//释放内存呢
    return x;
}
char LinkStack::GetTop() {
    if(top==NULL)throw"None";
    else{return top->data;}
}
void LinkStack::Clear() {
    if(top!= NULL)this->Pop();
}
string LinkStack::Empty() {
    string a=(top==NULL)?"Yes":"No";
    return a;
}
int main() {
    LinkStack list;
    char command;
    char n;
    while(cin>>command)
    {
        if(command=='E')
            break;
        try{
            switch(command)
            {
                case'P':
                    cin>>n;
                    list.Push(n);
                    break;
                case 'D':
                    cout<<list.Pop();
                    break;
                case 'G':
                    cout<<list.GetTop();
                    break;
                case 'T':
                    list.Clear();
                    break;
                case 'Y':
                    cout<<list.Empty();
                    break;
            }}catch (const char* str){cout<<str;}
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jay叶湘伦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值