一.栈的基本操作和应用代码实现
栈的详解:数据结构——栈_慢慢~漫漫的博客-CSDN博客
#include<stdio.h>
#include<stdlib.h>
#define stack_init_size 10
#define STACKSIZE 10
//定义栈结构
typedef struct
{
int *base; //栈底
int *top; //栈顶
int stacksize; //栈的内存
}SqStack;
//初始化栈
void InitStack(SqStack * s)
{
s -> base = (int *)malloc (stack_init_size * sizeof(int)); //动态开辟空间给栈
if(!s->base)
exit(0);
s->top = s->base;
s->stacksize = stack_init_size;
}
//压栈
void Push(SqStack * s , int e)
{
if(s->top - s->base == s->stacksize)
{
//如果栈的内存不够,就为它扩容
s->base = (int *) realloc(s->base,(s->stacksize + STACKSIZE)*sizeof(int));
if(!s->base)
exit(0);
s->top = s->base + s->stacksize;//扩容后的新栈顶
s->stacksize+=STACKSIZE;//扩容后的新空间
}
*s -> top = e;
s -> top++;
}
//出栈
int Pop(SqStack * s)
{
int e;
if(s->top == s->base)
{
printf("栈已空!\n");
exit(0);
}
s -> top--;
e = *s->top;
return e;
}
//判断栈是否为空
int EmptyStack(SqStack s)
{
if(s.top == s.base)
return 1;
else
return 0;
}
//置空栈
void ClearStack(SqStack * s)
{
s -> top = s -> base;
}
//打印栈
void PrintStack(SqStack s)
{
while(!EmptyStack(s)) //这里相当于while(EmptyStack(s) == 0),根据Empty函数,当等于0的时候,说明栈不空
{
s.top--;
printf("%d ",*s.top);
}
printf("\n\n");
}
//进制转化函数
void conversion(int N , int d)
{
SqStack M;
InitStack(&M);
printf("你输入的数值%d转换成%d进制后为: ",N,d);
while(N)
{
Push(&M,N%d); //取余数,压入栈中
N = N/d; //取除数
}
while(!EmptyStack(M))
{
PrintStack(M); //打印栈
break;
}
printf("\n");
}
//主函数
int main()
{
SqStack M;
int x,y,c,i,j;
InitStack(&M);
printf("—栈已初始化—\n\n");
printf("请输入你要进行的操作:\n");
printf("********************************");
printf("\n*****1.入栈 2.出栈****\n");
printf("*****3.进制转化 4.退出****\n");
printf("********************************\n\n"); //这里是个小菜单
scanf("%d", &x);
while(x!=0)
{
switch(x)
{
case 1:printf("请输入要入栈的数值: \n");
scanf("%d",&y);
Push(&M,y);
PrintStack(M);
break;
case 2:printf("出栈的数值为: ");
c = Pop(&M);
printf("%d\n",c); //栈中弹出来的数给c。再把c打印一下
PrintStack(M);
break;
case 3:printf("请输入要转换的数值和进制:\n");
scanf("%d%d",&i,&j);
conversion(i,j);
break;
case 4:exit(0);
break;
default:printf("输入有误,请重新输入: \n");
}
printf("********************************");
printf("\n*****1.入栈 2.出栈****\n");
printf("*****3.进制转化 4.退出****\n");
printf("********************************\n\n");
scanf("%d", &x);
}
return 0;
}