一.设置相应的结构体
typedef int value;
typedef struct{
value *top; //栈顶指针
value *base; //栈底指针,在构造之前以及销毁之后其base的值为NULL
int stacksize; //当前存储数据的空间的大小
}SqStack;
注意stacksize是指相应的当前的栈的空间。
二.创建栈的空间
int InitStack(SqStack &s) //创建一个新的栈
{
s.base =(value *)malloc(STACK *sizeof(value));
if(!s.base)
{
exit(OVERFLOW);
printf("创建失败,请重新输入:");
}else{
s.base = NULL;
s.top = s.base;
s.stacksize = STACK;
printf("创建成功,请进行下一步操作:");
}
return OK;
}
创建空间时可以是将s.base == s.Top设置为0或者可以不设置。
三.判断栈是否为空
int ifempty(SqStack s) //判断此栈是否为空
{
if(s.top == NULL || s.base == NULL)
{
printf("创造的栈为空栈,请输入数值:\n");
}
else{
printf("创造的栈不为空栈,请进行下一步操作:\n");
}
return OK;
}
注意:此处有两种判断方法
1.看s.Top与s.base是否等于NULL。
2.判断s.Top与s.base是否相等。
四.栈的输入与输出
int Push(SqStack &s,value T) //往创建好的栈当中输入相应的数字
{
if(s.top - s.base >= s.stacksize) //栈满,则追加一些空间
{
s.base = (value *)realloc(s.base,(s.stacksize + ADD)*sizeof(value));
if(!s.base)
{
exit(OVERFLOW);
}
s.top = s.base + s.stacksize;
s.stacksize = s.stacksize + STACK; //扩充后的空间
}
*s.top++ = T;
return OK;
}
int input(SqStack s)
{
int i=0;
int n=0;
value j=0;
printf("请输入想要输入的个数(每个数字用回车隔开):");
scanf("%d", &n);
for(i=0; i<n; i++)
{
printf("请输入数字:");
scanf("%d", &j);
Push(s,j);
}
return OK;
}
int Pop(SqStack &s,value &T) //输出相应的栈
{
if(s.top == NULL || s.base == NULL)
if(s.base)
{
T = *--s.top;
printf("其数字为:%d", T);
}
return OK;
}
此处在输入时要考虑是否有足够的储存空间,若是没有足够的空间那么就需要realloc再次分配一些空间。
*s.top++ = T(s.top是在栈最上方元素的上一位其先要在此位置输入相应的数字,再将s.top所指的向上移一位)。
对于栈的输出来说其在输出时需要注意s.base是否为NULL。
(此处需注意的是由于栈顶指针的位置问题,在输出元素时需要将栈顶指针先向下移一位再进行输出)。
六.栈基本知识
1.栈是先进后出的结构。
2.创建栈的空间之前要先宏定义相应的空间。
3.栈顶指针始终在栈顶元素的下一个位置上。
4.判断栈是否为空的方法:一.判断其栈头与栈尾指针是否等于NULL(此处要先看是否在创建空间时设置了NULL)。
二.判断s.top与s.base是否相等。
5.进栈与出栈时要注意空间大小以及相应指针的位置。