数据结构学习【栈 链式结构 C++】
本次实现的是栈的链式存储结构——链栈。
默认采用头结点。
#include <iostream>
using namespace std;
// ADT
// InitStack(&S) //初始化栈
// DestroyStack(&S) //销毁栈
// Push(&S,x) //进栈
// Pop(&S,&x) //出栈 弹出栈顶元素
// GetTop(S,&x) //读栈顶元素 不改变栈
// IsEmpty(S);//判断栈是否为空
// PrintStack(S);//顺序输出栈
typedef struct LinkNode{
int data;
struct LinkNode *next;
}LinkNode,*LinkStack;
// Code
//初始化栈
bool InitStack(LinkStack &S){
S=(LinkNode*)malloc(sizeof(LinkNode));
if(S==nullptr)//假设内存不足,返回false
return false;
S->next=nullptr;
return true;
}
//销毁栈
void DestroyStack(LinkStack &S){
LinkNode* p;
while(S){
p=S;
S=S->next;
free(p);
}
}
//进栈 链栈一般不存在栈满情况
bool Push(LinkStack &S,int x){
LinkNode* p=(LinkNode*)malloc(sizeof(LinkNode));
p->data=x;
p->next=S->next;
S->next=p;
return true;
}
//出栈 弹出栈顶元素
bool Pop(LinkStack &S,int &x){
if(S->next==nullptr)//判断是否栈空
return false;
LinkNode* p=S->next;//获得栈顶元素指针
x=p->data;
S->next=p->next;
free(p);
return true;
}
//读栈顶元素 不改变栈
bool GetTop(LinkStack S,int &x){
if(S->next==nullptr)//判断是否栈空
return false;
x=S->next->data;
return true;
}
//判断栈是否为空
bool IsEmpty(LinkStack S){
if(S->next==nullptr)//判断是否栈空
return false;
else
return false;
}
//顺序输出栈
void PrintStack(LinkStack S){
printf("栈内元素(从栈顶开始):");
LinkStack p=S->next;
while(p!=nullptr){
printf("%2d,",p->data);
p=p->next;
}
printf("\n");
}
int main(){
LinkStack S;
//创建栈并push元素
InitStack(S);
Push(S,1);
Push(S,2);
Push(S,3);
Push(S,4);
Push(S,5);
PrintStack(S);
//pop一个元素
int x=-1;
Pop(S,x);
printf("弹出栈顶元素:%d\n",x);
PrintStack(S);
//获得栈顶元素
GetTop(S,x);
printf("栈顶元素为:%d\n",x);
PrintStack(S);
system("pause");
}
结果如图