顺序栈和顺序表操作大体相似,只是顺序栈限制条件更加严格,遵循后进先出的原则,删除插入都只能在末尾进行
注:由于进栈出栈都会对栈本身内容有影响所以这里定义的函数模块都采用传地址传参
#include<stdlib.h>
#define MAXSIZE 10
#pragma warning(disable:6386)
typedef struct Stack
{
int* base;//栈底指针
int* top;//栈顶指针
int stacksize;//栈的最大容量
}Stack;
//初始化
Stack Initstack()
{
Stack S;//创建栈
S.base = (int*)malloc(sizeof(int) * MAXSIZE);
if (S.base == NULL)
{
printf("内存分配失败:\n");
exit(1);
}
S.stacksize = MAXSIZE;
S.top = S.base;
return S;
}
//进栈
void Push(Stack* S,int x)
{
if (S->top-S->base == S->stacksize)//栈满
{
printf("正在重新分配空间:\n");
int* p = S->base;
S->base = (int*)malloc(sizeof(int) * (S->stacksize + MAXSIZE));
if (S->base == NULL)
{
printf("内存分配错误:\n");
exit(1);
}
//将原来的栈内容拷贝进新开辟的空间内;
int i = 0;
for (i = 0; i < S->stacksize; i++)
{
S->base[i] = p[i];//拷贝元数据
}
//释放原来的空间
free(p);
//更改当前栈的最大容量记录
S->stacksize += MAXSIZE;
}
//进栈
*(S->top )= x;
S->top++;//更新头指针
printf("进栈成功\n");
}
//出栈
int Pop(Stack* S)
{
if (S->base == S->top)//栈为空时
{
printf("栈为空:\n");
exit(1);
}
int x = *(--S->top);
printf("出栈成功:\n");
return x;
}
//打印栈
void Show(Stack* s)
{
if (s->top == 0)
printf("栈为空:\n");
if (s->base == NULL)
{
printf("栈不存在\n");
exit(0);
}
//由于栈内数据是后进先出的,所以打印数据时由顶向底打印
for (int i = s->top -s->base- 1; i >= 0; --i)
{
printf("%d\t", s->base[i]);
}
printf("\n");
}
//销毁栈
void Distroy(Stack* S)
{
free(S->base);
S->stacksize = 0;
S->base = NULL;
S->top = 0;
printf("成功销毁:\n");
}
//清空栈
void Clear(Stack* S)
{
S->top = 0;
printf("操作成功:\n");
}
int main()
{
printf("******1:进栈*******2:出栈\n");
printf("******3:清理栈*****4:销毁栈\n");
printf("******5:打印*******6:退出\n");
printf("请选择:\n");
int n;
int j = 0;
scanf_s("%d", &n);
Stack S = Initstack();
while (1)
{
switch (n)
{
case 1:
printf("请输入栈顶的值:");
scanf_s("%d", &j);
Push(&S,j);
break;
case 2:
printf("出栈的值为%d\n", Pop(&S));
break;
case 3:
Clear(&S);
break;
case 4:
Distroy(&S);
break;
case 5:
Show(&S);
break;
default:
printf("选择错误\n");
}
printf("******1:进栈*******2:出栈\n");
printf("******3:清理栈*****4:销毁栈\n");
printf("*********5:打印*****6:退出\n");
printf("请选择:\n");
scanf_s("%d", &n);
if (n == 6)
break;
}
return 0;
运行结果如下:
如果能优化代码,欢迎各位大佬留言