前面经说过,根据存储结构的不同,将栈分为顺序栈和链栈
链栈按照链式存储结构存储
链栈原理和理解
由于栈的删除和插入操作仅限制在表头进行,所以链表的表头指针(指向头结点)就作为栈顶指针(便于方便直接使用带头结点的链表)
因此,若top(表头指针,栈顶指针)->next=NULL,则链栈为空
整个理解过程可理解为头插法
链栈的定义
typedef char ElemType; typedef struct Node { ElemType data; struct Node *next; }LinkStackNode,*LinkStack;
LinkStack表示栈顶指针(指向头结点),LinkStackNode表示栈的每个节点,每个节点的data域表示数据元素,next域指向下一个节点
链栈的初始化:
//链栈的初始化 void Init(LinkStack top) { top->next=NULL; }
头结点下一个为空
链栈的入栈操作:不需要担心是否发生上溢
//入栈操作 bool PushStack(LinkStack top,ElemType x) { LinkStackNode *temp; temp=(LinkStackNode*)malloc(sizeof(LinkStackNode)); if(temp==NULL) return false; else { temp->data=x; temp->next=top->next; top->next=temp; free(temp); return true; } }
由于采用了链式存储的方式,不需要担心是否上溢,注意temp要申请内存空间,并且不能释放!!!!!
链表的出栈操作
//出栈操作 bool PopStack(LinkStack top,ElemType* e) { LinkStackNode* temp; temp=top->next; if(temp==NULL) return false; else { *e=temp->data; top->next=temp->next; free(temp); return true; } }
注意判断是否为空,并且注意不要重复申请内存空间,并记得释放内存(temp)