C语言实现栈的顺序存储表示和实现

2021.08.16
1、记录自己学习数据结构中对于栈的顺序存储的实现,实现了对于栈的顺序存储的增删改查
2、其中最难的是插入删除因为该操作都涉及到了top指针的移动,

  1. 插入函数Push代码片段+详解:
Status Push(SqStack& S, SElemType e) {
	if (S.top - S.base >= S.stacksize) {
		SElemType* newplace = (SElemType*)realloc(S.base, (STACKINCREMENT + STACK_INIT_SIZE) * sizeof(SElemType));
		if (!newplace) {
			exit(OVERFLOW);
		}
		S.base = newplace;
		S.stacksize = S.stacksize + STACKINCREMENT;
	}
	*S.top++ = e;
	return OK;
}

详解部分:
1、严蔚敏《数据结构》C语言版中对于栈的顺序存储,其中top=base表示栈为空!而当栈不为空的时候,top指针总是指向栈顶的“上面”一个位置,也就是下一次添加的那个位置!
2、首先需要判断是否已经超过了栈本身的容量:S.top - S.base >= S.stacksize如果超出了原先创建的容量,那么就需要重新创建新的容量,使用realloc函数,(想要了解realloc函数的使用方法----->点击查看realloc用法),然后判断新建的容量是否成功。
3、然后重新将新的容量大小赋值给S.stacksize,执行S.stacksize = S.stacksize + STACKINCREMENT;
4、*S.top++ = e;语句解析:相当于先执行*S.top = e;然后执行S.top++;

  1. 删除函数Pop代码片段+详解:
Status Pop(SqStack& S, SElemType& e) {
	if (S.base == S.top) {
		return ERROR;
	}
	e = *(--S.top);
	return OK;
}

详解部分:
1、首先判断是否栈空,如果栈空就无法删除,S.base == S.top表示栈空情况。
2、删除栈顶元素,首先由于top指针指向的是栈顶的“下”一个位置,也就是下次添加数值的位置,所以语句:e = *(--S.top);相当于先执行S.top--;然后执行e = *S.top;

完整代码展示如下

#include<stdio.h>
#include<stdlib.h>


#define	STACK_INIT_SIZE	100
#define	STACKINCREMENT	10
#define	OK	1
#define	ERROR		0
#define	OVERFLOW		-2	
typedef int SElemType;
typedef int Status;

typedef struct {
	SElemType* base;
	SElemType* top;
	int stacksize;
}SqStack;

Status InitStack(SqStack& S);											//初始化一个栈
Status GetTop(SqStack S, SElemType& e);						//将栈顶元素数值赋值给e
Status Push(SqStack& S, SElemType e);							///将值为e的数插入到栈定中
Status Pop(SqStack& S, SElemType& e);							//元素出栈操作
Status ChangeStack(SqStack& S, SElemType e);				//将栈顶元素的值改为e
Status ShowStack(SqStack S);											//展示当前栈的所有数据
Status DestroyStack(SqStack& S);										//摧毁当前栈!
void ShowInterface();															//展示操作面板


int main() {
	SqStack mystack;
	int e = 0;
	char switch_on;
	bool isFlag = true;
	ShowInterface();
	InitStack(mystack);
	while (isFlag)
	{
		printf("请输入你想要实现功能的次序号:");
		scanf("%c", &switch_on);
		getchar();
		int number;
		switch (switch_on)
		{
		case '1':
			printf("请输入需要增加的数字的值:");
			scanf("%d", &number);
			getchar();
			system("cls");
			ShowInterface();
			if (Push(mystack, number) == OK) {
				printf("添加成功!\n");
			}
			else {
				printf("添加失败!\n");
			}
			break;
		case'2':
			system("cls");
			ShowInterface();
			if (GetTop(mystack, e) == OK)
			{
				printf("当前栈顶元素的值为:%d\n", e);
			}
			else {
				printf("查看失败!\n");
			}
			break;
		case'3':
			system("cls");
			ShowInterface();
			if (Pop(mystack, e) == OK)
			{
				printf("删除成功!当前栈顶元素值为:%d\n", e);
			}
			else {
				printf("删除失败!\n");
			}
			break;
		case'4':
			printf("请输入你想要修改成的值为多少:");
			scanf("%d", &number);
			getchar();
			system("cls");
			ShowInterface();
			if (ChangeStack(mystack, number) == OK) {
				printf("修改成功!\n");
			}
			else {
				printf("修改失败!\n");
			}
			break;
		case'5':
			system("cls");
			ShowInterface();
			if (ShowStack(mystack) != OK)
				printf("当前栈为空,展示失败!\n");
			break;
		case'6':
			mystack.top = mystack.base;
			printf("栈清空成功!\n");
			break;
		case'0':
			isFlag = false;
			system("cls");
			printf("程序退出成功!欢迎下次使用!");
			DestroyStack(mystack);
			break;
		default:
			isFlag = false;
			system("cls");
			printf("程序退出成功!欢迎下次使用!");
			DestroyStack(mystack);
			break;
		}
	}
	return OK;
}

Status InitStack(SqStack& S) {
	S.base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));
	if (!S.base) {
		exit(OVERFLOW);
	}
	S.top = S.base;
	S.stacksize = STACK_INIT_SIZE;
	return OK;
}

Status GetTop(SqStack S, SElemType& e) {
	if (S.top == S.base) {
		return ERROR;
	}
	e = *(S.top - 1);
	return OK;
}

Status Push(SqStack& S, SElemType e) {
	if (S.top - S.base >= S.stacksize) {
		SElemType* newplace = (SElemType*)realloc(S.base, (STACKINCREMENT + STACK_INIT_SIZE) * sizeof(SElemType));
		if (!newplace) {
			exit(OVERFLOW);
		}
		S.base = newplace;
		S.stacksize = S.stacksize + STACKINCREMENT;
	}
	*S.top++ = e;
	return OK;
}

Status Pop(SqStack& S, SElemType& e) {
	if (S.base == S.top) {
		return ERROR;
	}
	e = *(--S.top);
	return OK;
}

Status ChangeStack(SqStack& S, SElemType e) {
	if (S.base == S.top) {
		return ERROR;
	}
	*(S.top - 1) = e;
	return OK;
}

Status ShowStack(SqStack S) {
	if (S.base != S.top) {
		printf("当前栈的所有数据(依次出栈展示):");
	}
	else {
		return ERROR;
	}
	for (S.top;S.top > S.base;S.top--)
	{
		printf("%d\t", *(S.top - 1));
	}
	printf("\n");
	return OK;
}

Status DestroyStack(SqStack& S) {
	free(S.base);
	S.base = NULL;
	S.stacksize = 0;
	return OK;
}

void ShowInterface() {
	printf("输入 1 实现对栈顶的-增加-数据\n");
	printf("输入 2 实现对栈顶的-查看-数据\n");
	printf("输入 3 实现对栈顶的-删除-数据\n");
	printf("输入 4 实现对栈顶的-修改-数据\n");
	printf("输入 5 实现展示当前栈的所有数据(从栈顶到栈尾)\n");
	printf("输入 6 实现清空当前栈\n");
	printf("输入 0 实现退出程序\n");
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丶彩衣吹笛人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值