链栈:
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
/*
栈:初始化、销毁、判定空栈、求长度、取栈顶元素、置空栈、入栈、出栈
*/
// 栈的定义
typedef struct StackNode
{
int data; // 数据域
struct StackNode* next; // 指针域
}StackNode, *LinkStack;
// 初始化
bool InitStack(LinkStack& S)
{
// 王卓老师视频没有头结点,但是可以创建一个头节点,数据域同于存放元素个数
// 构造一个空栈,栈顶指针置为空
/*S = new StackNode;
S->next = nullptr;
S->data = 0;*/
S = nullptr;
return true;
}
// 判断栈是否为空
bool IsEmpty(LinkStack S)
{
if (S == nullptr) return true;
else
{
return false;
}
}
// 链栈的入栈
bool PushStack(LinkStack& S, int e)
{
StackNode* p = new StackNode; // 生成新结点 p
p->data = e;
p->next = S; // 将新结点的 next域赋值为 S 指针指向的地址,也就是将新结点插入到栈顶
S = p; //将S指针向上移动到节点p处
return true;
}
// 链表的出栈
bool PopStack(LinkStack& S, int& e)
{
if (S == nullptr)return false;
else
{
e = S->data; // 将栈顶数据域赋给 e 带回
LinkStack p = S; //创建新指针 p,并将p指向 栈顶空间
S = S->next; // 将S指针移到栈定空间的下面一个空间处,到这一步实际做的就是栈定元素出栈了
delete p; //释放指针p;
}
}
// 取栈顶元素
int GetTopElem(LinkStack S, int& e)
{
if (S == nullptr) return false;
e = S->data;
return e;
}
int main()
{
LinkStack S;
InitStack(S);
cout << IsEmpty(S) << endl;
// 入栈
PushStack(S, 50);
PushStack(S, 40);
PushStack(S, 30);
PushStack(S, 20);
PushStack(S, 10);
PushStack(S, 10101);
int e;
cout << "栈定元素为:" << GetTopElem(S, e) << endl;
cout << "依次出栈的元素为:" << endl;
while (S != nullptr)
{
int p;
PopStack(S, p);
//cout << GetTopElem(S, p) << endl;
cout << p << endl;
}
return 0;
}