参考王道《2023年数据结构考研复习指导》
一、带头结点
#include <iostream>
typedef int ElemType;
typedef struct LiStackNode {
ElemType data;
struct LiStackNode* next;
} LiStackNode, *LiStack;
// 初始化链栈
// 初始化栈
bool InitStack(LiStack& S) {
S = (LiStackNode*)malloc(sizeof(LiStackNode));
if (S == NULL) // 内存分配失败
return false;
S->next = NULL;
return true;
}
// 判断栈空
bool StackEmpty(LiStack S) {
if (S->next == NULL)
return true;
else
return false;
}
// 进栈操作——新元素入栈
bool Push(LiStack& S, ElemType x) {
LiStackNode* p = (LiStackNode*)malloc(sizeof(LiStackNode));
if (p == NULL) // 内存分配失败
return false;
p->data = x;
p->next = S->next;
S->next = p;
return true;
}
// 出栈操作
bool Pop(LiStack& S, ElemType& x) {
if (S->next == NULL) // 栈空,报错
return false;
LiStackNode* p = S->next;
x = p->data;
S->next = p->next;
free(p);
return true;
}
// 读栈顶操作
bool GetTop(LiStack S, ElemType& x) {
if (S->next == NULL) // 栈空,报错
return false;
x = S->next->data;
return true;
}
// 销毁链栈
void DestroyStack(LiStack& S) {
LiStackNode* p = S->next;
LiStackNode* q;
while (p != NULL) {
q = p;
p = p->next;
free(q);
}
free(S);
S = NULL;
}
int main() {
LiStack S;
InitStack(S);
std::cout << StackEmpty(S) << std::endl;
Push(S, 1);
Push(S, 2);
Push(S, 3);
int x = -1;
Pop(S, x);
std::cout << x << std::endl;
GetTop(S, x);
std::cout << x << std::endl;
Pop(S, x);
std::cout << x << std::endl;
Pop(S, x);
std::cout << x << std::endl;
std::cout << StackEmpty(S) << std::endl;
DestroyStack(S);
system("pause");
return 0;
}
二、不带头结点
#include <iostream>
typedef int ElemType;
typedef struct LiStackNode {
ElemType data;
struct LiStackNode* next;
} LiStackNode, * LiStack;
// 初始化链栈
// 初始化栈
bool InitStack(LiStack& S) {
S = NULL;
return true;
}
// 判断栈空
bool StackEmpty(LiStack S) {
if (S == NULL)
return true;
else
return false;
}
// 进栈操作——新元素入栈
bool Push(LiStack& S, ElemType x) {
LiStackNode* p = (LiStackNode*)malloc(sizeof(LiStackNode));
if (p == NULL) // 内存分配失败
return false;
p->data = x;
p->next = S;
S = p;
return true;
}
// 出栈操作
bool Pop(LiStack& S, ElemType& x) {
if (S == NULL) // 栈空,报错
return false;
LiStackNode* p = S;
x = p->data;
S = p->next;
free(p);
return true;
}
// 读栈顶操作
bool GetTop(LiStack S, ElemType& x) {
if (S == NULL) // 栈空,报错
return false;
x = S->data;
return true;
}
// 销毁链栈
void DestroyStack(LiStack& S) {
LiStackNode* p;
while (S != NULL) {
p = S;
S = S->next;
free(p);
}
S = NULL;
}
int main() {
LiStack S;
InitStack(S);
std::cout << StackEmpty(S) << std::endl;
Push(S, 1);
Push(S, 2);
Push(S, 3);
int x = -1;
Pop(S, x);
std::cout << x << std::endl;
GetTop(S, x);
std::cout << x << std::endl;
Pop(S, x);
std::cout << x << std::endl;
Pop(S, x);
std::cout << x << std::endl;
std::cout << StackEmpty(S) << std::endl;
DestroyStack(S);
system("pause");
return 0;
}