2021.08.16
1、记录自己学习数据结构中对于栈的顺序存储的实现,实现了对于栈的顺序存储的增删改查
2、其中最难的是插入和删除因为该操作都涉及到了top指针的移动,
- 插入函数
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++;
- 删除函数
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");
}