请你定义一个链栈,可以对链栈进行 “将某个元素入栈”、“弹出栈顶元素”、“取栈顶元素(不删除)”、“判断栈是否为空”、
“清空栈”等操作。键盘输入一些命令,可以执行上述操作。本题中,栈的元素为字符。
输入描述
各个命令以及相关数据的输入格式如下: 将某个元素入栈: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;
}