链式栈
在上节我们提到了顺序栈,而链式栈就是把顺序栈用链表的方式来存储,如果对链表和顺序栈的学习较为深刻的话,学习链式栈会非常容易。
首先第一步和单链表操作基本相同,创建一个结构体,一块是数据域,另一块是指针域,用来指向下一个元素;
typedef struct Stack{
int data;
struct Stack *next;
}Stack;
对于链式栈的结构,可以看下图:
然后我们来看链式栈的一些基本操作:
初始化栈:
Stack *InitStack(Stack *s)//初始化栈
{
s=NULL;
return s;
}
判断栈是否为空栈:
bool emptystack(Stack* s) {
//判断是否为空栈
if (s)return true;
else return false;
}
链式栈的入栈操作:
Stack* push(Stack* s, int newnum) {
//链式栈的入栈操作
Stack* newstack=(Stack*)malloc(sizeof(Stack));
newstack->data = newnum;
newstack->next = s;
s = newstack;
return s;
}
逐个打印栈内元素
void print(Stack*s){
//逐个打印栈内元素
Stack *a=s;
while(a){
printf("%d ",a->data);
a=a->next;
}
}
链式栈的出栈操作
Stack* pop(Stack* s,int *newnum) {
//链式栈的出栈操作
if (s==NULL) {
printf("栈已空");
return NULL;
}
else {
*newnum = s->data;
Stack* p = s;
s = s->next;
free(p);
return s;
}
}
然后我们在主函数测试一下这些函数:
int main()
{
Stack *s;
s=InitStack(s);
int i;
for(i=1;i<=10;i++){
s=push(s,i);
}
print(s);
}
运行结果: