顺序栈(动态)

顺序栈和顺序表操作大体相似,只是顺序栈限制条件更加严格,遵循后进先出的原则,删除插入都只能在末尾进行

注:由于进栈出栈都会对栈本身内容有影响所以这里定义的函数模块都采用传地址传参

#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;

运行结果如下:

 如果能优化代码,欢迎各位大佬留言

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值