[D-OJ练习] 栈的链式存储结构与操作

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

输入描述

 

各个命令以及相关数据的输入格式如下:
将某个元素入栈: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 ch;
	Node* next;
	Node(char c):ch(c), next(NULL){}
};
class Stack {
private:
	int length;
	Node* pTop;

public:
	Stack();
	void Push(char newCh);
	void GetTop();
	void Pop();
	void Clear();
	bool IsNone();
};

Stack::Stack() {
	length = 0;
	pTop = NULL;
}

void Stack::Push(char newCh) {
	Node* p = new Node(newCh);
	p->next = pTop;
	pTop = p;
	length++;
}
void Stack::GetTop(){
	if(length == 0){
		cout << "None" ;
		return ;
	}
	cout << pTop->ch ;
}

void Stack::Pop(){
	if(length == 0){
		cout << "None";
		return ;
	}
	
	cout << pTop->ch;
	Node* p = pTop;
	pTop = pTop->next;
	
	delete p;
	length--;

}

void Stack::Clear(){
	Node* topNext = NULL;
	Node* p = pTop;
	while(p){
		topNext = p->next;
		delete p;
		p = topNext;
	}
	pTop = NULL;
	length = 0;
}

bool Stack::IsNone(){
	if(length){
		return false;
	} else{
		return true;
	}
}
int main()
{
	Stack s;
	char choice;
	char addCh,ch;
	int isContinue = 1;
	while (isContinue) 
	{
		cin >> choice;
		switch (choice)
		{
		case 'P':
			cin >> addCh;
			s.Push(addCh);
			break;
		case 'G':
			s.GetTop();
			break;
		case 'D':
			s.Pop();
			break;
		case 'T':
			s.Clear();
			break;
		case 'Y':
			if(s.IsNone()){
				cout << "Yes";
			}else{
				cout << "No";
			}
			break;
		case 'E':
			isContinue = 0;
			break;
		}
	}
	return 0;
}

posted @ 2021-09-25 16:51  泥烟  阅读(31)  评论(0编辑  收藏  举报