简介部分:
链栈的实现和单链表大同小异,不带头结点可以减少对指针指向的调整操作,更便于理解及实现栈这种操作受限线性表(只能从栈顶一端入栈出栈)的逻辑结构;
需要注意的几点是:
1.链栈不需要判满,随用随申请;
2.链栈为空时不能出栈,不能取栈顶;
3.链式存储的栈比顺序存储的栈(包括顺序栈)对空间的利用率更高;
源代码展示:
以下是源代码:
#include<bits/stdc++.h>
using namespace std;
#define ElemType int
typedef struct LinkStackNode{
ElemType data;
struct LinkStackNode *next;
}LinkedStackNode,*LinkedStack;
//无头结点版
//初始化
void InitStack(LinkedStack &top){
top = NULL;
}
//辅助函数--新建结点
LinkedStackNode * CreateNode(){
LinkedStackNode *Node = (LinkedStackNode*) malloc(sizeof (LinkedStackNode));
if(Node!=NULL) return Node;
}
//入栈(头插逆序入栈)
void Push(LinkedStack &top,ElemType x){
LinkedStackNode *p = CreateNode();
p->data = x;
p->next = top;
top = p;
}
//出栈(顺序扫描删除)
bool Pop(LinkedStack &top,ElemType &y){
if(top==NULL) return false;
y = top->data;//传回
LinkedStackNode *q = top;//备份
top = top->next;//栈顶--(逻辑删除)
free(q);//回收内存(物理删除)
return true;
}
//取栈顶
bool GetTop(LinkedStack top,ElemType &z){
if(top==NULL) return false;
z = top->data;
return true;
}
int main(){
//声明头指针
LinkedStack top;
//测试初始化
InitStack(top);
//测试入栈(1,2,3,4,5)
for(int i = 1;i<=5;i++) Push(top,i);
//测试取栈顶(5)
int tmp;
if(GetTop(top,tmp)) printf("StackTop:%d\n",tmp);
//测试出栈(5,4) 新栈顶3
for(int i = 1;i<=2;i++) if(Pop(top,tmp)) printf("Pop:%d\n",tmp);
if(GetTop(top,tmp)) printf("StackTop_New:%d",tmp);
return 0;
}
运行结果展示