栈链相关代码。
1、向栈顶插入元素
2、删除栈顶元素
3、判断栈是否为空
4、读取栈顶元素
0、退出程序
栈其实就是一个特殊的线性表(输入输出只能在一端)
基于这一特性完成栈链的相关操作
注意事项:
由于插入和删除操作只可以在一端(链表头部),所以在构建栈链时不需要设置头结点。
栈链初始化如下
//初始化栈链
void InisStack(StackList& S) {
S = NULL; //栈顶置空
}
在进行删除栈顶元素和读取栈顶元素时,都需要判断栈内是否为空,所以采用bool类型返回值。
删除栈顶元素代码如下:
//判断栈是否为空
bool StackEmpty(StackList S) {
if (S == NULL) {
return true;
}
return false;
}
//出栈操作
bool Pop(StackList& S, int& i) {
if (StackEmpty(S))
return false;
StackNode* s = S;
S = S->next;
i = s->data;
free(s);
return true;
}
完整代码:
纯手打,亲测可以运行,使用自取。
#include <iostream>
using namespace std;
//链结点
typedef struct StackNode {
int data;
struct StackNode* next;
}StackNode,*StackList;
//初始化栈链
void InisStack(StackList& S) {
S = NULL; //栈顶置空
}
//入栈操作
void Push(StackList& S, int i) {
StackNode* s = (StackNode*)malloc(sizeof(StackNode));
if (s == NULL) {
cout << "内存分配失败" << endl;
}
s->data = i;
s->next = S;
S = s;
}
//判断栈是否为空
bool StackEmpty(StackList S) {
if (S == NULL) {
return true;
}
return false;
}
//出栈操作
bool Pop(StackList& S, int& i) {
if (StackEmpty(S))
return false;
StackNode* s = S;
S = S->next;
i = s->data;
free(s);
return true;
}
//读栈操作
bool GetTop(StackList S, int& i) {
if (StackEmpty(S))
return false;
i = S->data;
return true;
}
int main() {
StackList S;
InisStack(S);
while (true) {
cout << "=========================================" << endl;
cout << "=======| 1、向栈顶插入元素 |=======" << endl;
cout << "=======| 2、删除栈顶元素 |=======" << endl;
cout << "=======| 3、判断栈是否为空 |=======" << endl;
cout << "=======| 4、读取栈顶元素 |=======" << endl;
cout << "=======| 0、退出程序 |=======" << endl;
cout << "=========================================" << endl;
cout << "你要实现的功能:" << endl;
cout << "================" << endl;
int select;
cin >> select;
switch (select) {
case 1://入栈
cout << "你想要插入的数值是: " << endl;
int temp1;
cin >> temp1;
Push(S, temp1);
cout << "插入成功" << endl;
system("pause");
system("cls");
break;
case 2://出栈
int temp2;
if (Pop(S, temp2))
cout << "已删除,删除的元素为:" << temp2 << endl;
else
cout << "该栈为空栈" << endl;
system("pause");
system("cls");
break;
case 3://判断是否为空
if (StackEmpty(S))
cout << "该栈为空栈" << endl;
else
cout << "该栈不为空栈" << endl;
system("pause");
system("cls");
break;
case 4://读取栈顶元素
int temp3;
if (GetTop(S, temp3))
cout << "栈顶元素为:" << temp3 << endl;
else
cout << "该栈为空栈" << endl;
system("pause");
system("cls");
break;
case 0:
cout << "已退出" << endl;
exit(0);
default:
cout << "输入有误,请重新输入" << endl;
break;
}
}
}
部分运行结果如下:
![](https://img-blog.csdnimg.cn/4925cfd5caae4adeb54d826faf274228.png)
![](https://img-blog.csdnimg.cn/c0662e9e06ad4d8a9fb78275df0a2bc5.png)
![](https://img-blog.csdnimg.cn/cc4ff21541c14c7e91fb9cc95bd38030.png)