这一章是关于链栈的代码实现。
链栈的数据结构:
/*链栈结点的数据结构*/
typedef struct StackNode{
ElemType data; //数据域
struct StackNode* next; //指针域
}StackNode, * ListStack;
主要函数如下:
- bool Push(ListStack& S, ElemType e) 功能:入栈;
参数:S:栈, e:入栈的元素;
时间复杂度:O(1); - bool Pop(ListStack& S, ElemType& e) 功能:出栈,出栈元素赋值给e;
参数:S:栈, e:出栈的元素;
时间复杂度:O(1); - bool GetTop(ListStack& S, ElemType& e) 功能:取栈顶元素并返回,不改变栈的元素;
参数:S:栈, e:储存取得的栈顶元素;
时间复杂度:O(1); - void PrintListStack(ListStack S) 功能:从栈顶到栈底输出所有元素;
参数:S:栈;
时间复杂度:O(n);
完整代码:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#define ElemType int
/*--------------------------------------------数据结构部分--------------------------------------------*/
/*链栈结点的数据结构*/
typedef struct StackNode{
ElemType data; //数据域
struct StackNode* next; //指针域
}StackNode, * ListStack;
void InitStack(ListStack& S) {
S = NULL;
}
/*入栈*/
bool Push(ListStack& S, ElemType e) {
StackNode* p;
p = new StackNode;
p->data = e;
p->next = S;
S = p;
return true;
}
/*出栈*/
bool Pop(ListStack& S, ElemType& e) {
ListStack p;
if (S == NULL) //判断是否栈空
return false;
e = S->data;
p = S;
S = S->next;
free(p); //释放结点
return true;
}
/*取栈顶元素*/
bool GetTop(ListStack& S, ElemType& e) {
if (S == NULL) //判断是否栈空
return false;
e = S->data;
return true;
}
/*从栈顶到栈底输出所有元素*/
void PrintListStack(ListStack S) {
int sum = 0;
StackNode* p = S;
if (!p)
printf("栈空\n");
else {
printf("栈顶->栈底:\n");
while (p)
{
sum++;
printf("%d ",p->data);
p = p->next;
}
printf("共有%d个元素", sum);
}
}
/*--------------------------------------------功能函数部分--------------------------------------------*/
void menu() {
printf("\n\n");
printf("----------①创建链栈----------\n");
printf("----------② 入栈 ----------\n");
printf("----------③ 出栈 ----------\n");
printf("----------④ 取栈顶 ----------\n");
printf("----------⑤ 打印栈 ----------\n");
printf("按“0”退出\n");
printf("\n\n");
}
/*创建链栈功能*/
void CreateListStack(ListStack& S) {
InitStack(S);
int n, i = 0;
ElemType e;
printf("输入创建的栈的元素个数:\n");
scanf("%d", &n);
printf("逐个输入栈的元素:\n");
while (i < n)
{
scanf("%d", &e);
Push(S, e);
i++;
}
}
/*入栈功能*/
void PushToStack(ListStack& S) {
ElemType e;
printf("输入要入栈的元素:\n");
scanf("%d", &e);
if (Push(S, e)) {
printf("入栈成功!\n");
}
else {
printf("入栈失败,栈已满!");
}
}
/*出栈功能*/
void PopFromStack(ListStack& S) {
ElemType e;
if (Pop(S, e)) {
printf("%d出栈成功!\n", e);
}
else
printf("栈空,出栈失败!\n");
}
/*取栈顶元素功能*/
void GetTopStack(ListStack S) {
ElemType e;
if (GetTop(S, e))
printf("取栈顶成功!栈顶元素为%d\n", e);
else
printf("取栈顶失败!栈空\n");
}
int main() {
ListStack S;
int choice;
do
{
menu();
scanf("%d", &choice);
switch (choice)
{
case(1):
CreateListStack(S);
break;
case(2):
PushToStack(S);
break;
case(3):
PopFromStack(S);
break;
case(4):
GetTopStack(S);
break;
case(5):
PrintListStack(S);
break;
default:
break;
}
} while (choice != 0);
return 0;
}