文章目录
- 1 链栈定义
- 2 链栈基本操作
- 3 链栈代码实现
1 链栈定义
链栈:采用链式存储的栈称为链栈
在一个链栈中,栈底就是链表的最后一个结点,而栈顶总是链表的第一个结点。因此,新入栈的元素即为链表新的第一个结点,只要系统还有存储空间,就不会有栈满的情况发生。
链栈的优点在于多个栈共享存储空间和提高其效率,且不存在栈满上溢的情况,通常采用单链表实现,并规定所有操作都是在单链表的表头进行的。
2 链栈基本操作
- 初始化链栈
void InitStack(LinkStack*s)
{*s=(LinkSNode*)malloc(sizeof(LinkSNode));(*s)->next=NULL;
}
- 判断栈空
int LinkStackEmpty(LinkStack*S)
{return S->top==NULL;
}
- 入栈操作
void Push(LinkStack s,int e)
{LinkStack p=(LinkStack)malloc(sizeof(LinkSNode));p->data=e;p->next=s->next;s->next=p;
}
将要入栈的元素构造结点p,然后将其插入到栈顶指针s之后,让s始终指向新插入的结点(保证s永远是栈顶指针)
- 出栈操作
int Pop(LinkStack s,int*e)
{LinkStack p;if(EmptyStack(s))return ERROR;p=S->next;*e=p->data;s->next=p->next;free(p);return OK;
}
- 入出都要保证s永远是栈顶指针
- 所有栈(队列)的操作,都要注意入栈(队)判满,出栈(队)判空的检查
- 是否为满,满时不进,是否为空,空时不出
- 取栈顶元素
int Get Top(LinkStack s,int*e)
{if(EmptyStack(s))return ERROR;*e=s->next->data;return OK;
}
3 链栈代码实现
#include <stdio.h>
#include <stdlib.h>typedef int ElementType; // 特殊的线性表,只有在栈顶一端进行插入删除
typedef struct node {ElementType data;struct node *Next;
} *Stack;Stack InitStack(void)
{Stack s = (Stack)malloc(sizeof(struct node));s->data = 0;s->Next = NULL;
}void Push(Stack s, ElementType e) //保证S永远是栈顶指针
{Stack p = (Stack)malloc(sizeof(struct node));p->data = e;p->Next = s->Next;s->Next = p;
}void Pop(Stack s, ElementType *e) //保证S永远是栈顶指针
{if (s->Next == NULL) {return;}Stack p = s->Next;*e = p->data;s->Next = p->Next;free(p);
}void PrtStack(Stack s)
{Stack p = s->Next;while (p) {printf("%d ", p->data);p = p->Next;}printf("\n");
}int main(void)
{ElementType e;Stack s = InitStack();printf("please input a element :");scanf("%d", &e);Push(s, e);PrtStack(s);Pop(s, &e);printf("Pop a element : %d ", e);return 0;
}