栈的基本操作(详细)
本文章会详细介绍栈的基本操作
目录
3.输入栈内元素(由于起初输入栈不牵扯到栈的扩容,所以对此部分注释)
1.本文章中全部实现的功能
栈的特点,先进后出。
void program()
{
printf("t请输入以下功能数字n");
printf("t0.退出n");
printf("t1.判断栈是否为空n");
printf("t2.按栈弹出的顺序输出栈n");
printf("t3.按栈输入的顺序输出栈里面的值n");
printf("t4.获取栈顶元素n");
printf("t5.摧毁一个栈n");
printf("t6.清空一个栈n");
printf("t7.求栈的长度n");
printf("t8.弹栈,并且返回出弹栈元素n");
printf("t9.输入栈内数据n");
printf("t10.在清空的基础下重新建立栈n");
printf("t11.请输入想要插入栈顶的元素n");
}
2.建栈
Status InitStack(SqStack &S)
{
//建栈
S.base=(int*)malloc(Stack_Init_Size*sizeof(int));
if(!S.base) exit(OVERFLOW);
S.top=S.base;
S.stacksize=Stack_Init_Size;
return OK;
}
3.输入栈内元素(由于起初输入栈不牵扯到栈的扩容,所以对此部分注释)
SqStack InputStack(SqStack &S)
{
int a;
/*scanf("%d",&a);
while(a!=-1)
{
if(S->top-S->base>S->stacksize)
{
S->base=(int *)realloc(S->base,(Stack_Init_Size+Stack_Increment)*sizeof(int));
if(!S->base) printf("NoReallocn");
S->top=S->base+S->stacksize;
S->stacksize=S->stacksize+Stack_Increment;
}
*S->top++ = a;
scanf("%d",&a);
}*/
InitStack(S);
printf("t");
for(int i=0;;i++){
scanf("%d",&a);
if(a==-1)break;
*S.top++ =a;
}
printf("t写入完成n");
}
4.进栈
如果栈的内容小于输入内容不需要扩展直接*S.top++=e;但是当内容大于了栈的内容。就进入if语句。
Status Push(SqStack &S,int e)
{
//进栈
if(S.top-S.base>S.stacksize)
{
S.base=(int *)realloc(S.base,(Stack_Init_Size+Stack_Increment)*sizeof(int));
if(!S.base) printf("NoReallocn");
S.top=S.base+S.stacksize;
S.stacksize=S.stacksize+Stack_Increment;
}
*S.top++=e;
return OK;
}
5.弹栈,并且返回出弹栈元素
Status Pop(SqStack &S,int *e)
{
//弹栈,并且返回出弹栈元素
*e=*--S.top;
return OK;
}
6.栈内元素的个数
Status StackLength(SqStack S)
{
//栈长
int Length=S.top-S.base;
printf("tlength = %dn",Length);
return Length;
}
7.按栈输入的顺序输出栈里面的值
void PrintStack_int(SqStack S)
{
//按栈输入的顺序输出栈里面的值
int *p=S.base;
while(p!=S.top)
{
printf("t");
printf(" %d ",*p);
p++;
}
printf("n");
}
8.按栈弹出的顺序输出栈
void PrintStack_Pop(SqStack S)
{
//按栈弹出的顺序输出栈
int *p=S.top-1;
while(p!=S.base-1)
{
printf("t");
printf(" %d ",*p);
p--;
}
printf("n");
}
9.判断栈是否为空
void IsNullStack(SqStack S)
{
//判断栈是否为空
if(S.base==S.top||S.base==NULL)
printf("t栈为空栈n");
else
printf("t栈不为空n");
}
10.获取栈顶元素
Status GetTop(SqStack S)
{
//获取栈顶元素
int e;
e=*(S.top-1);
printf("t栈顶元素为%dn",e);
}
11.清空一个栈
void ClearStack(SqStack &S)
{
//清空一个栈
S.top=S.base;
}
12.摧毁一个栈
void DestroyStack(SqStack &S)
{
//摧毁一个栈
free(S.base);
S.base=S.top;
S.stacksize=0;
S.top=NULL;
S.base=NULL;
}
13.switch功能语句
void swi(SqStack S){
int num;
program();
printf("t输入的元素是:");
scanf("%d",&num);
printf("nn");
while(num)
{
switch(num)
{
case 0:
num=0;
break;
case 1:
if(S.base==NULL){
printf("t在进行操作1之前需要操作功能9n");
}else{
printf("t判断栈是否为空n");
IsNullStack(S);
}
break;
case 2:
if(S.base==NULL){
printf("t在进行操作2之前需要操作功能9n");
}else{
printf("t2.按栈弹出的顺序输出栈n");
PrintStack_Pop(S);
}
break;
case 3:
if(S.base==NULL){
printf("t在进行操作3之前需要操作功能9n");
}else{
printf("t3.按栈输入的顺序输出栈里面的值n");
PrintStack_int(S);
}
break;
case 4:
if(S.base==NULL){
printf("t在进行操作4之前需要操作功能9n");
}else{
printf("t4.获取栈顶元素n");
GetTop(S);
}
break;
case 5:
if(S.base==NULL){
printf("t在进行操作5之前需要操作功能9n");
}else{
printf("t5.摧毁一个栈n");
DestroyStack(S);
printf("t栈已经被摧毁n");
}
break;
case 6:
if(S.base==NULL){
printf("t在进行操作6之前需要操作功能9n");
}else{
printf("t6.清空一个栈n");
ClearStack(S);
printf("t栈已经清空");
}
break;
case 7:
if(S.base==NULL){
printf("t在进行操作7之前需要操作功能9n");
}else{
printf("t7.求栈的长度n");
StackLength(S);
}
break;
case 8:
if(S.base==NULL){
printf("t在进行操作8之前需要操作功能9n");
}else{
printf("t弹栈,并且返回出弹栈元素n");
int a;
Pop(S,&a);
printf("t8.弹栈弹出的元素是%dn",a);
}
break;
case 9:
printf("t9.输入栈内数据n");
InputStack(S);
break;
case 10:
if(S.base==NULL){
printf("t在进行操作10之前需要操作功能9n");
}else{
printf("t10.在清空的基础下重新建立栈n");
DestroyStack(S);
printf("t请重新输入栈内数据n");
InputStack(S);
}
break;
case 11:
if(S.base==NULL){
printf("t在进行操作11之前需要操作功能9n");
}else{
printf("t11.在栈顶插入元素n");
int x;
printf("t请输入想要插入栈顶的元素:n");
scanf("%d",&x);
Push(S,x);
printf("t插入完成n");
}
break;
default:
printf("输入有误,请重新输入n");
}
printf("nnn");
program();
printf("t输入的元素是:");
scanf("%d",&num);
printf("nn");
}
}
14.全部代码
//define区
#define Stack_Init_Size 100
#define Stack_Increment 10
#define OK 1
#define OVERFLOW -2
#define ERROR 0
//预处理指令区
#include<stdio.h>
#include<stdlib.h>
//typedef
typedef int Status;
typedef struct {
int *base;
int *top;
int stacksize;
}SqStack;
Status InitStack(SqStack &S); //建栈
SqStack InputStack(SqStack &S); //输入栈内元素
Status Push(SqStack &S,int e); //进栈
Status Pop(SqStack &S,int *e); //弹栈,并且返回出弹栈元素
Status StackLength(SqStack S); //栈内元素的个数
void PrintStack_int(SqStack S); //按栈输入的顺序输出栈里面的值
void PrintStack_Pop(SqStack S); //按弹栈顺序输出栈里面的值
void IsNullStack(SqStack S); //判断是否为空栈
Status GetTop(SqStack S); //获取栈顶元素
void ClearStack(SqStack &S); //清空栈
void DestroyStack(SqStack &S); //摧毁栈
void program(); //功能函数
void swi(SqStack S); //switch
int main()
{
SqStack S;
S.base=NULL;
swi(S);
printf("t程序退出了,下次见n");
}
Status InitStack(SqStack &S)
{
//建栈
S.base=(int*)malloc(Stack_Init_Size*sizeof(int));
if(!S.base) exit(OVERFLOW);
S.top=S.base;
S.stacksize=Stack_Init_Size;
return OK;
}
SqStack InputStack(SqStack &S)
{
int a;
/*scanf("%d",&a);
while(a!=-1)
{
if(S->top-S->base>S->stacksize)
{
S->base=(int *)realloc(S->base,(Stack_Init_Size+Stack_Increment)*sizeof(int));
if(!S->base) printf("NoReallocn");
S->top=S->base+S->stacksize;
S->stacksize=S->stacksize+Stack_Increment;
}
*S->top++ = a;
scanf("%d",&a);
}*/
InitStack(S);
printf("t");
for(int i=0;;i++){
scanf("%d",&a);
if(a==-1)break;
*S.top++ =a;
}
printf("t写入完成n");
}
Status Push(SqStack &S,int e)
{
//进栈
if(S.top-S.base>S.stacksize)
{
S.base=(int *)realloc(S.base,(Stack_Init_Size+Stack_Increment)*sizeof(int));
if(!S.base) printf("NoReallocn");
S.top=S.base+S.stacksize;
S.stacksize=S.stacksize+Stack_Increment;
}
*S.top++=e;
return OK;
}
Status Pop(SqStack &S,int *e)
{
//弹栈,并且返回出弹栈元素
*e=*--S.top;
return OK;
}
Status StackLength(SqStack S)
{
//栈长
int Length=S.top-S.base;
printf("tlength = %dn",Length);
return Length;
}
void PrintStack_int(SqStack S)
{
//按栈输入的顺序输出栈里面的值
int *p=S.base;
while(p!=S.top)
{
printf("t");
printf(" %d ",*p);
p++;
}
printf("n");
}
void PrintStack_Pop(SqStack S)
{
//按栈弹出的顺序输出栈
int *p=S.top-1;
while(p!=S.base-1)
{
printf("t");
printf(" %d ",*p);
p--;
}
printf("n");
}
void IsNullStack(SqStack S)
{
//判断栈是否为空
if(S.base==S.top||S.base==NULL)
printf("t栈为空栈n");
else
printf("t栈不为空n");
}
Status GetTop(SqStack S)
{
//获取栈顶元素
int e;
e=*(S.top-1);
printf("t栈顶元素为%dn",e);
}
void ClearStack(SqStack &S)
{
//清空一个栈
S.top=S.base;
}
void DestroyStack(SqStack &S)
{
//摧毁一个栈
free(S.base);
S.base=S.top;
S.stacksize=0;
S.top=NULL;
S.base=NULL;
}
void program()
{
printf("t请输入以下功能数字n");
printf("t0.退出n");
printf("t1.判断栈是否为空n");
printf("t2.按栈弹出的顺序输出栈n");
printf("t3.按栈输入的顺序输出栈里面的值n");
printf("t4.获取栈顶元素n");
printf("t5.摧毁一个栈n");
printf("t6.清空一个栈n");
printf("t7.求栈的长度n");
printf("t8.弹栈,并且返回出弹栈元素n");
printf("t9.输入栈内数据n");
printf("t10.在清空的基础下重新建立栈n");
printf("t11.请输入想要插入栈顶的元素n");
}
void swi(SqStack S){
int num;
program();
printf("t输入的元素是:");
scanf("%d",&num);
printf("nn");
while(num)
{
switch(num)
{
case 0:
num=0;
break;
case 1:
if(S.base==NULL){
printf("t在进行操作1之前需要操作功能9n");
}else{
printf("t判断栈是否为空n");
IsNullStack(S);
}
break;
case 2:
if(S.base==NULL){
printf("t在进行操作2之前需要操作功能9n");
}else{
printf("t2.按栈弹出的顺序输出栈n");
PrintStack_Pop(S);
}
break;
case 3:
if(S.base==NULL){
printf("t在进行操作3之前需要操作功能9n");
}else{
printf("t3.按栈输入的顺序输出栈里面的值n");
PrintStack_int(S);
}
break;
case 4:
if(S.base==NULL){
printf("t在进行操作4之前需要操作功能9n");
}else{
printf("t4.获取栈顶元素n");
GetTop(S);
}
break;
case 5:
if(S.base==NULL){
printf("t在进行操作5之前需要操作功能9n");
}else{
printf("t5.摧毁一个栈n");
DestroyStack(S);
printf("t栈已经被摧毁n");
}
break;
case 6:
if(S.base==NULL){
printf("t在进行操作6之前需要操作功能9n");
}else{
printf("t6.清空一个栈n");
ClearStack(S);
printf("t栈已经清空");
}
break;
case 7:
if(S.base==NULL){
printf("t在进行操作7之前需要操作功能9n");
}else{
printf("t7.求栈的长度n");
StackLength(S);
}
break;
case 8:
if(S.base==NULL){
printf("t在进行操作8之前需要操作功能9n");
}else{
printf("t弹栈,并且返回出弹栈元素n");
int a;
Pop(S,&a);
printf("t8.弹栈弹出的元素是%dn",a);
}
break;
case 9:
printf("t9.输入栈内数据n");
InputStack(S);
break;
case 10:
if(S.base==NULL){
printf("t在进行操作10之前需要操作功能9n");
}else{
printf("t10.在清空的基础下重新建立栈n");
DestroyStack(S);
printf("t请重新输入栈内数据n");
InputStack(S);
}
break;
case 11:
if(S.base==NULL){
printf("t在进行操作11之前需要操作功能9n");
}else{
printf("t11.在栈顶插入元素n");
int x;
printf("t请输入想要插入栈顶的元素:n");
scanf("%d",&x);
Push(S,x);
printf("t插入完成n");
}
break;
default:
printf("输入有误,请重新输入n");
}
printf("nnn");
program();
printf("t输入的元素是:");
scanf("%d",&num);
printf("nn");
}
}
15.运行结果
在没有建立栈的条件下如果输入别的数据
1.建栈
2.按栈弹出的顺序输出栈
3.按栈输入的顺序输出栈里面的值
4.获取栈顶元素
7.求栈的长度
8.弹栈,并且返回出弹栈元素
验证:
11.请输入想要插入栈顶的元素
6.清空
验证:
10.在清空的状态下重新输入栈
验证:
5.摧毁栈
0.退出