采用单链表来实现堆栈需要考虑一个问题:使用表头作为栈顶还是表尾作为栈顶?
如果使用表尾作栈顶,进栈时在表尾插入一个新元素很方便,但出栈时删除最后一个结点时,需要从头开始查找倒数第二个元素并置其指针域为空。
使用表头则没有这种情况发生,本程序即采用表头作为栈顶。
/*堆栈的链式存储的C++实现与测试*/
#include<iostream>using namespace std;
#define ERROR -100/*定义函数异常时的返回值*/
typedef int ElementType;
typedef struct SNode *Lstack;/*定义一个间接访问堆栈的数据结构*/
/*定义结构体*/
struct SNode{
ElementType Data;/*数据域*/
Lstack next;/*指针域*/
};
/*新建一个空堆栈*/
Lstack CreateEmpty(){
Lstack Ptrs;
Ptrs=(Lstack)malloc(sizeof(struct SNode));/*新建新结点并分配空间*/
Ptrs->next=NULL;/*定义为空链表*/
return Ptrs;
}
/*入栈*/
Lstack Push(Lstack Ptrs,ElementType x){
Lstack s;
s=(Lstack)malloc(sizeof(struct SNode));
s->Data=x;/*定义一个结点,分配空间并赋值,该节点为新入栈元素*/
s->next=Ptrs;/*将原链表接到入栈元素后边*/
Ptrs=s;/*将新链表赋值给原链表并返回*/
return Ptrs;
}
/*出栈*/
ElementType Pop(Lstack Ptrs){
ElementType n;/*存储出栈元素数值*/
Lstack s;/*定义一个指针*/
if(Ptrs->next ==NULL){
cout<<"empty"<<endl;
return ERROR;
}/*栈空则返回错误*/
n=Ptrs->Data;/*将第一个节点也就是栈顶的数值赋给n*/
s=Ptrs;/*s指向原链表头结点*/
Ptrs=Ptrs->next;/*新链表从原链表第二个结点开始*/
free(s);/*释放原链表的第一个节点空间*/
return n;/*返回栈顶值*/
}
/*测试*/
int main(){
Lstack L;
int k;/*存储栈顶元素*/
L=CreateEmpty();/*初始化一个空栈*/
L=Push(L,3);/*将3入栈*/
k=Pop(L);
cout<<k<<endl;/*3出栈*/
return 0;
}