链栈的表示:链栈是运算受限的单链表,只能在链表头部进行操作。(用链式存储,存储的栈)
类型定义:
// 栈的结点类型 typedef struct StackNode{ // 数据域,用来存放栈中元素 // 所以它的类型是栈里元素的类型 SElemType data; // 指针域是指向下一个元素的 // 所以它指向的类型仍然是这种(StackNode)结构类型 // 所以这样定义这个指针,即规定它要指向什么样的结构类型才合法 struct StackNode *next; // 再用这样一个类型定义一个指向这样结点的指针类型, // 也就是*LinkStack } StackNode, *LinkStack; // 用大写字母 S 来表示Stack 栈 LinkStack S;
栈的存储:(第一个元素就是栈底,最后一个元素就是栈顶,S指向栈顶)
注意!!!链栈中指针的方向和单链表的指针方向是不同的,
单链表是第一个元素指向第二个元素,第二个指向第三个
链栈里的指向是反过来的,由最后一个指向倒数第二个,以此类推
① 链栈的头指针就是栈顶
② 不需要头结点
③ 基本不存在栈满的情况(只要内存有空间,不会栈满)
④ 空栈相当于头指针指向空
⑤ 插入和删除仅在栈顶处执行
链栈的初始化
void InitStack(LinkStack &S){ // 构造一个空栈,栈顶指针置为空 // S 是头指针 S = NULL; return OK; }
【补充算法】判断链栈是否为空
就是判断头指针是否为空,如果为空就返回TRUE,否则返回FALSE
Status StackEmpty(LinkStack S){ if(S == NULL){ return TRUE; }else{ return FALSE; } }
链栈的入栈
S指向栈顶元素,S为头指针
① P->next = S // 让P所指向的元素指向S所指向的元素
② S = P // 修改头指针指向位置
Status Push(LinkStack &S, SElemType e){ p = new StackNode; // 生成新节点P p -> data = e; // 将新节点数据域设置为 e p -> next = S; // 将新节点插入栈顶 S = p; // 修改栈顶指针 return OK; }
链栈的出栈
① 让一个指针 P 指向 S 所指向结点
② 让指针 S 指向下一个结点
③ 销毁 指针P 所指向结点
Status Pop(LinkStack &S, SElemType &e){ if(S == NULL){ return ERROR; } e = S -> data; p = S; S = S -> next; delete p; return OK; }
取栈顶元素
SElemType GetTop(LinkStack S){ if(S!=NULL){ return S->data; } }