栈使用到top(栈顶指针) 和 base(栈底指针)的为《动态栈》,需要两个指针->下方有完整代码
《静态栈》只使用到一个top(栈顶"伪"指针)->下方有完整代码
栈的基本操作(基于动态栈)
1:初始化
status InitStack(Sqstack& S)//栈的初始化
{
S.base = (SElemType*)malloc(sizeof(SElemType[MAX]));
if (!S.base)
{
return OVERFLOW;
}
S.top = S.base;
S.Stacksize = MAX;
return ok;
}
2:入栈
status push(Sqstack& S, SElemType e)//入栈操作
{
if (S.top - S.base == MAX)
{
return 0;
}
*S.top++ = e;
return ok;
}
3:出栈
status pop(Sqstack& S, SElemType &e)//出栈操作
{
if (S.top == S.base)
{
return 0;
}
e=*--S.top;
return ok;
}
4:取栈顶
SElemType GetTop(Sqstack S)//取栈顶操作
{
if (S.top != S.base)
{
return *--S.top;
}
}
5:输出栈的所有内容
void StackEmpty(Sqstack S)//判断栈是否为空
{
if (S.top != S.base)
{
printf("非空栈");
}
else
{
printf("空栈");
}
}
void StackTraverse(Sqstack S)//输出所有栈的内容
{
SElemType* p;
p = S.top;
while (p != S.base)
{
printf("%d\n", *--p);
}
}
--------------------------------------------------以上为基本操作的展示-------------------------------------------------
使用的编译器是vs2019,源文件后缀为.cpp。
动态栈的完整代码:
#define _CRT_SECURE_NO_WARNINGS//栈
#include <stdio.h>
#include <malloc.h>
//全局定义特殊变量
#define ok 1
#define OVERFLOW 0
#define MAX 50
//转定义区域
typedef int SElemType;
typedef int status;
typedef struct//定义栈
{
SElemType* top;
SElemType* base;
int Stacksize;
}Sqstack;
status InitStack(Sqstack& S)//栈的初始化
{
S.base = (SElemType*)malloc(sizeof(SElemType[MAX]));
if (!S.base)
{
return OVERFLOW;
}
S.top = S.base;
S.Stacksize = MAX;
return ok;
}
void Packfun1(Sqstack& S)
{
int i;
i=InitStack(S);
if (i = 1)
{
printf("初始化成功!");
}
else
{
printf("初始化失败!");
}
}
status push(Sqstack& S, SElemType e)//入栈操作
{
if (S.top - S.base == MAX)
{
return 0;
}
*S.top++ = e;
return ok;
}
void Packfun2(Sqstack& S)
{
int i;
SElemType e;
printf("请输入要入栈的值:");
scanf("%d",&e);
i=push(S,e);
if (i = 1)
{
printf("入栈成功!");
}
else
{
printf("入栈失败!");
}
}
status pop(Sqstack& S, SElemType &e)//出栈操作
{
if (S.top == S.base)
{
return 0;
}
e=*--S.top;
return ok;
}
void Packfun3(Sqstack& S)
{
int i;
SElemType e=0;
i=pop(S, e);
if (i == 1)
{
printf("%d已经出栈", e);
}
else
{
printf("该栈无元素");
}
}
SElemType GetTop(Sqstack S)//取栈顶操作
{
if (S.top != S.base)
{
return *--S.top;
}
}
void Packfun4(Sqstack& S)
{
int i;
i=GetTop(S);
printf("现在栈顶的值为:%d",i);
}
void StackEmpty(Sqstack S)//判断栈是否为空
{
if (S.top != S.base)
{
printf("非空栈");
}
else
{
printf("空栈");
}
}
void StackTraverse(Sqstack S)//输出所有栈的内容
{
SElemType* p;
p = S.top;
while (p != S.base)
{
printf("%d\n", *--p);
}
}
void StackLength(Sqstack S)//输出栈的长度
{
int i=0;
SElemType* p;
p = S.top;
while (p != S.base)
{
--p;
i++;
}
printf("该栈的长度为%d", i);
}
void Clearstack(Sqstack& S)//清空栈
{
S.top = S.base;
printf("栈已清空!");
}
int main()
{
int a, f = 0, i = 0;
Sqstack S;
while (1)
{
printf("\n");
printf("================================\n");
printf("| 动态栈的操作系统 |\n");
printf("================================\n");
printf("| 1.初始化动态栈 |\n");
printf("| 2.入栈 |\n");
printf("| 3.出栈 |\n");
printf("| 4.取栈顶值 |\n");
printf("| 5.遍历(显示栈的内容) |\n");
printf("| 6.求栈的长度 |\n");
printf("| 7.判断栈的状况 |\n");
printf("| 8.清空栈的内容 |\n");
printf("| 0.退出动态栈操作系统 |\n");
printf("================================\n");
printf("请选择功能(0-10):");
mark:scanf("%d", &a);
switch (a)
{
case 0:f = 1; break;
case 1: Packfun1(S); break;
case 2: Packfun2(S); break;
case 3: Packfun3(S); break;
case 4: Packfun4(S); break;
case 5: StackTraverse(S); break;
case 6: StackLength(S); break;
case 7: StackEmpty(S); break;
case 8: Clearstack(S); break;
default:printf("选择功能错误!请重新选择菜单功能:"); goto mark;
}
if (f == 1)
{
printf("已经退出系统");
break;//该break是为了退出while的无限“菜单”循环
}
}
}
静态栈的完整代码:ps(静态栈的top只是作为一个"数组[ top ]"的索引)
#define _CRT_SECURE_NO_WARNINGS//栈
#include <stdio.h>
#include <malloc.h>
//全局定义特殊变量
#define ok 1
#define OVERFLOW 0
#define MAX 50
//转定义区域
typedef int SElemType;
typedef int status;
//函数声明
typedef struct//定义栈
{
SElemType data[MAX];
int top;
}Sqstack;
status InitStack(Sqstack& S)//栈的初始化
{
S.top = -1;
return ok;
}
void Packfun1(Sqstack& S)
{
int i;
i = InitStack(S);
if (i = 1)
{
printf("初始化成功!");
}
else
{
printf("初始化失败!");
}
}
status push(Sqstack& S, SElemType e)//入栈操作
{
if (S.top == MAX)
{
return 0;
}
S.data[++S.top]= e;
return ok;
}
void Packfun2(Sqstack& S)
{
int i;
SElemType e;
printf("请输入要入栈的值:");
scanf("%d", &e);
i = push(S, e);
if (i = 1)
{
printf("入栈成功!");
}
else
{
printf("入栈失败!");
}
}
status pop(Sqstack& S, SElemType& e)//出栈操作
{
if (S.top == -1)
{
return 0;
}
e = S.data[S.top--];
return ok;
}
void Packfun3(Sqstack& S)
{
int i;
SElemType e = 0;
i = pop(S, e);
if (i == 1)
{
printf("%d已经出栈", e);
}
else
{
printf("该栈无元素");
}
}
SElemType GetTop(Sqstack S)//取栈顶操作
{
if (S.top != MAX)
{
return S.data[S.top];
}
}
void Packfun4(Sqstack& S)
{
int i;
i = GetTop(S);
printf("现在栈顶的值为:%d", i);
}
void StackEmpty(Sqstack S)//判断栈是否为空
{
if (S.top != -1)
{
printf("非空栈");
}
else
{
printf("空栈");
}
}
void StackTraverse(Sqstack S)//输出栈的内容
{
StackEmpty(S);
while (S.top != -1)
{
printf("%d\n", S.data[S.top--]);
}
}
void StackLength(Sqstack S)//输出栈的长度
{
int i = 0;
while (S.top != -1)
{
--S.top;
i++;
}
printf("该栈的长度为%d", i);
}
void Clearstack(Sqstack& S)//清空栈
{
S.top = -1;
printf("栈已清空!");
}
int main()
{
int a, f = 0, i = 0;
Sqstack S;
while (1)
{
printf("\n");
printf("================================\n");
printf("| 动态栈的操作系统 |\n");
printf("================================\n");
printf("| 1.初始化动态栈 |\n");
printf("| 2.入栈 |\n");
printf("| 3.出栈 |\n");
printf("| 4.取栈顶值 |\n");
printf("| 5.遍历(显示栈的内容) |\n");
printf("| 6.求栈的长度 |\n");
printf("| 7.判断栈的状况 |\n");
printf("| 8.清空栈的内容 |\n");
printf("| 0.退出动态栈操作系统 |\n");
printf("================================\n");
printf("请选择功能(0-10):");
mark:scanf("%d", &a);
switch (a)
{
case 0:f = 1; break;
case 1: Packfun1(S); break;
case 2: Packfun2(S); break;
case 3: Packfun3(S); break;
case 4: Packfun4(S); break;
case 5: StackTraverse(S); break;
case 6: StackLength(S); break;
case 7: StackEmpty(S); break;
case 8: Clearstack(S); break;
default:printf("选择功能错误!请重新选择菜单功能:"); goto mark;
}
if (f == 1)
{
printf("已经退出系统");
break;//该break是为了退出while的无限“菜单”循环
}
}
}