文章目录
⭐️写在前面的话⭐️
📒博客主页: 程序员好冰
🎉欢迎 【点赞👍 关注🔎 收藏⭐️ 留言📝】
📌本文由 程序员好冰 原创,优快云 首发!
📆入站时间: 🌴2022 年 07 月 13 日🌴
✉️ 是非不入松风耳,花落花开只读书。
💭推荐书籍:📚《Java编程思想》,📚《Java 核心技术卷》
💬参考在线编程网站:🌐牛客网🌐力扣
🍭 作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!🍭
动态顺序栈的实现
销毁栈和清空栈的区别
:
销毁栈:
- 从栈底指针到栈当前的容量,每一个位置都需要进行free;
- 将栈顶指针和栈底指针都置为NULL;
- 将栈当前的容量置为0.
清空栈:
- 栈顶指针指向栈底指针;
- 将栈当前容量恢复到原来的大小.
初始化
#include <stdio.h>
#include <stdlib.h>
//动态栈
#define OK 1
#define ERROR -1
#define STACK_INIT_SIZE 3//栈的初始大小
#define STACK_INCREMENT 10//扩容的步幅
typedef int ElemType;
typedef int Status;
typedef struct SqStack
{
ElemType *base;//栈底指针
ElemType *top;//栈顶指针
int stacksize;//栈当前的容量
}SqStack;
Status ExpanStack(SqStack*);
Status InitStack(SqStack*);
Status DestoryStack(SqStack*);
Status ClearStack(SqStack*);
Status StackIsEmpty(SqStack);
Status StackLength(SqStack);
Status GetTop(SqStack);
Status Push(SqStack*,ElemType);
Status Pop(SqStack*);
Status PrintStack(SqStack);
0、检查栈空间,并对栈进行扩容
//0、检查栈空间,并对栈进行扩容
Status ExpanStack(SqStack *S)
{
if(S->top-S->base>=S->stacksize){
S->base=(ElemType*)realloc(S->base,(S->stacksize+STACK_INCREMENT)*sizeof(ElemType));
if(!S->base){
printf("栈初始化失败.\n");
return ERROR;
}
S->top=S->base+S->stacksize;
S->stacksize +=STACK_INCREMENT;
}
return OK;
}
1、初始化栈
//1、初始化栈
Status InitStack(SqStack *S)
{
S->base=(ElemType*)malloc(sizeof(ElemType)*STACK_INIT_SIZE);
if(!S->base){
printf("栈初始化失败.\n");
return ERROR;
}
S->top=S->base;
S->stacksize=STACK_INIT_SIZE;
printf("栈初始化成功.\n");
return OK;
}
2、销毁栈
//栈顶指针和栈底指针都为NULL
//栈容量大小的每个位置都应该free,因为申请了STACK_INIT_SIZE大小的空间
//栈的容量置为0
//2、销毁栈
Status DestoryStack(SqStack *S)
{
int len=S->stacksize;
int i;
for(i=0;i<len;i++){
free(S->base);
S->base++;
}
S->top=NULL;
S->base=NULL;
S->stacksize=0;
return OK;
}
3、清空栈
//将栈顶指针指向栈底指针
//将栈容量恢复初始水平
//3、清空栈
Status ClearStack(SqStack *S)
{
S->top=S->base;
S->stacksize=STACK_INCREMENT;
printf("清空栈成功.\n");
return OK;
}
4、检查栈是否为空
//4、检查栈是否为空
Status StackIsEmpty(SqStack S)
{
if(S.top==S.base){
printf("当前栈为空.\n");
return ERROR;
}
if(S.top!=S.base){
printf("当前栈不为空.\n");
return OK;
}
return OK;
}
5、返回栈的长度
//5、返回栈的长度
Status StackLength(SqStack S)
{
if(S.top==S.base){
printf("当前栈的长度为:0,最大容量为:%d",S.stacksize);
return OK;
}
printf("当前栈的长度为:%d,最大容量为:%d",(S.top-S.base),S.stacksize);
return OK;
}
6、返回栈顶元素
//6、返回栈顶元素
Status GetTop(SqStack S)
{
if(S.top==S.base){
printf("栈空,请压栈后再操作.\n");
return ERROR;
}
printf("栈顶元素为%d.\n",*S.top);
return OK;
}
7、压栈
//7、压栈
Status Push(SqStack *S,ElemType e)
{
ExpanStack(S);
(S->top)++;
*(S->top)=e;
PrintStack(*S);
return OK;
}
8、弹栈
//8、弹栈
Status Pop(SqStack *S)
{
//注意这里的栈顶指针和栈底指针都不为空
if(S->top==S->base){
printf("栈空,请压栈后再操作.\n");
return ERROR;
}
printf("栈顶元素%d被弹出.\n",*(S->top));
S->top--;
PrintStack(*S);
return OK;
}
9、打印栈中所有元素
//9、打印栈中所有元素
Status PrintStack(SqStack S)
{
if(S.top==S.base){
printf("栈空,请压栈后再操作.\n");
return ERROR;
}
ElemType temp;
printf("栈为:");
while(S.top!=S.base){
temp=*(S.top);
printf("%d ",temp);
S.top--;
}
return OK;
}
主函数
int main()
{
SqStack S;
printf("请继续操作...\n");
while(1){
int input;
int value;
printf("\n==========================\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("9、打印栈中所有元素.\n");
printf("\n==========================\n");
printf("请输入对应操作的序号:");
scanf("%d",&input);
switch(input){
case 1:
InitStack(&S);
break;
case 2:
DestoryStack(&S);
break;
case 3:
ClearStack(&S);
break;
case 4:
StackIsEmpty(S);
break;
case 5:
StackLength(S);
break;
case 6:
GetTop(S);
break;
case 7:
printf("请输入需要压入的元素:");
scanf("%d",&value);
Push(&S,value);
break;
case 8:
Pop(&S);
break;
case 9:
PrintStack(S);
break;
}
}
return 0;
}
程序源码
#include <stdio.h>
#include <stdlib.h>
//动态栈
#define OK 1
#define ERROR -1
#define STACK_INIT_SIZE 3//栈的初始大小
#define STACK_INCREMENT 10//扩容的步幅
typedef int ElemType;
typedef int Status;
typedef struct SqStack
{
ElemType *base;//栈底指针
ElemType *top;//栈顶指针
int stacksize;//栈当前的容量
}SqStack;
Status ExpanStack(SqStack*);
Status InitStack(SqStack*);
Status DestoryStack(SqStack*);
Status ClearStack(SqStack*);
Status StackIsEmpty(SqStack);
int StackLength(SqStack);
Status GetTop(SqStack);
Status Push(SqStack*,ElemType);
Status Pop(SqStack*);
Status PrintStack(SqStack);
//0、检查栈空间,并对栈进行扩容
Status ExpanStack(SqStack *S)
{
if(S->top-S->base>=S->stacksize){
S->base=(ElemType*)realloc(S->base,(S->stacksize+STACK_INCREMENT)*sizeof(ElemType));
if(!S->base){
printf("栈初始化失败.\n");
return ERROR;
}
S->top=S->base+S->stacksize;
S->stacksize +=STACK_INCREMENT;
}
return OK;
}
//1、初始化栈
Status InitStack(SqStack *S)
{
S->base=(ElemType*)malloc(sizeof(ElemType)*STACK_INIT_SIZE);
if(!S->base){
printf("栈初始化失败.\n");
return ERROR;
}
S->top=S->base;
S->stacksize=STACK_INIT_SIZE;
printf("栈初始化成功.\n");
return OK;
}
//栈顶指针和栈底指针都为NULL
//栈容量大小的每个位置都应该free,因为申请了STACK_INIT_SIZE大小的空间
//栈的容量置为0
//2、销毁栈
Status DestoryStack(SqStack *S)
{
int len=S->stacksize;
int i;
for(i=0;i<len;i++){
free(S->base);
S->base++;
}
S->top=NULL;
S->base=NULL;
S->stacksize=0;
return OK;
}
//将栈顶指针指向栈底指针
//将栈容量恢复初始水平
//3、清空栈
Status ClearStack(SqStack *S)
{
S->top=S->base;
S->stacksize=STACK_INCREMENT;
printf("清空栈成功.\n");
return OK;
}
//4、检查栈是否为空
Status StackIsEmpty(SqStack S)
{
if(S.top==S.base){
printf("当前栈为空.\n");
return ERROR;
}
if(S.top!=S.base){
printf("当前栈不为空.\n");
return OK;
}
return OK;
}
//5、返回栈的长度
Status StackLength(SqStack S)
{
if(S.top==S.base){
printf("当前栈的长度为:0,最大容量为:%d",S.stacksize);
return OK;
}
printf("当前栈的长度为:%d,最大容量为:%d",(S.top-S.base),S.stacksize);
return OK;
}
//6、返回栈顶元素
Status GetTop(SqStack S)
{
if(S.top==S.base){
printf("栈空,请压栈后再操作.\n");
return ERROR;
}
printf("栈顶元素为%d.\n",*S.top);
return OK;
}
//7、压栈
Status Push(SqStack *S,ElemType e)
{
ExpanStack(S);
(S->top)++;
*(S->top)=e;
PrintStack(*S);
return OK;
}
//8、弹栈
Status Pop(SqStack *S)
{
//注意这里的栈顶指针和栈底指针都不为空
if(S->top==S->base){
printf("栈空,请压栈后再操作.\n");
return ERROR;
}
printf("栈顶元素%d被弹出.\n",*(S->top));
S->top--;
PrintStack(*S);
return OK;
}
//9、打印栈中所有元素
Status PrintStack(SqStack S)
{
if(S.top==S.base){
printf("栈空,请压栈后再操作.\n");
return ERROR;
}
ElemType temp;
printf("栈为:");
while(S.top!=S.base){
temp=*(S.top);
printf("%d ",temp);
S.top--;
}
return OK;
}
int main()
{
SqStack S;
printf("请继续操作...\n");
while(1){
int input;
int value;
printf("\n==========================\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("9、打印栈中所有元素.\n");
printf("\n==========================\n");
printf("请输入对应操作的序号:");
scanf("%d",&input);
switch(input){
case 1:
InitStack(&S);
break;
case 2:
DestoryStack(&S);
break;
case 3:
ClearStack(&S);
break;
case 4:
StackIsEmpty(S);
break;
case 5:
StackLength(S);
break;
case 6:
GetTop(S);
break;
case 7:
printf("请输入需要压入的元素:");
scanf("%d",&value);
Push(&S,value);
break;
case 8:
Pop(&S);
break;
case 9:
PrintStack(S);
break;
}
}
return 0;
}
运行截图
🚀先看后赞,养成习惯!🚀
🚀 先看后赞,养成习惯!🚀
🎈觉得文章写得不错的老铁们,点赞评论关注走一波!谢谢啦!🎈