两者的区别:顺序栈不存在节点,就是一个大大的空间,里面的数据存储在一个数组中,因此可能会发生栈满的情况; 链式栈由一个一个的节点组成,入栈时临时开辟空间。
主函数
//顺序栈
int main (){
Sqstack* s;
int i,e;
int a[MAX]={1,2,3};
s=InitStack(s);
s=pushstack(s,a);
e=popstack(s);
return 0;
}
//链式栈
int main () {
linkstack *stack;
int e;
stack=initstack(stack);
stack=pushstack (1, stack);
stack=pushstack (2,stack); //要有一个变量来接收函数的返回值
e=popstack(stack);
return 0;
}
类型声明
typedef struct Sqstack{
int data[MAX];
int top;
}Sqstack //声明顺序栈的类型
typedef struct stacknode {
int data;
struct stacknode *next;
}linkstack; //声明链式栈的类型
其中:top用作数组元素的移动;next用作节点的移动。
初始化栈
//初始化顺序栈
Sqstack * InitStack (Sqstack * s){
s=(Sqstack*)malloc(sizeof(Sqstack));
s->top=-1;
return s;
}
//初始化链式栈
linkstack* initstack (linkstack *stack) {
stack = (linkstack *)malloc(sizeof(linkstack));
stack->next = NULL;
return stack;
}
初始化栈即为栈分配空间,并且将其初始化为空栈(类似i初始化为0)
入栈
//顺序栈入栈
Sqstack* pushstack (Sqstack *s,int a[MAX]){
int i;
for (i=0;i<MAX;i++){
s->top++;
s->data[s->top]=a[i];
}
return s;
}
//链式栈入栈
linkstack* pushstack (int x, linkstack * stack) {
linkstack *p;
p = (linkstack*)malloc (sizeof(linkstack));
p->data = x;
p->next=stack; //p->next表示p的next指向的结点
stack=p;
return stack;
}
出栈
//顺序栈出栈
int popstack (Sqstack *s){
int i;
for (i=0;i<MAX;i++){
printf ("%d ",s->data[s->top]);
s->top--;
}
return 0;
}
//链式栈出栈
int popstack (linkstack *stack) {
if (stack->next == NULL)
return 1;
int e;
linkstack *p;
do {
p = (linkstack*)malloc (sizeof(linkstack));
e = stack->data;
printf("%d ", e);
p = stack;
stack = stack->next;
free (p); //要等到stack指向下一个值的时候再释放
}while(stack->next != NULL); //当满足条件(...)时
return e;
}