本文主要介绍链栈。链栈就是没有附加头结点的运算受限的单链表。在文中的栈顶指针放在一个结构体中,主要是为了操作方便,也可以不放在结构体里面,这个看个人啦~~数据结构真的很有意思,我会一直学习,将我知道的理解的数据结构呈现出来,当然错误之处难免,还请各位指出,共同进步哈
#include<cstdio>
#include<cstdlib>
typedef char Datatype; //假定栈元素的数据类型为字符
typedef struct node{
Datatype data;
struct node *next;
}StackNode;
typedef struct{ //LinkStack结构类型的定义是为了方便在函数体中修改top指针本身
StackNode *top;
}LinkStack;
//********************************栈的一些基本操作**********************************
void InitStack(LinkStack *S){
//将顺序栈置空
S->top=NULL;
}
int StackEmpty(LinkStack *S){
//判断顺序栈是否为空,若为空,则返回真,否则返回假
return S->top==NULL;
}
void Push(LinkStack *S,Datatype x){
//进栈操作
StackNode *p=(StackNode *)malloc(sizeof(StackNode));
p->data=x;
p->next=S->top; //将新结点*p插入链栈头部
S->top=p; //修改栈顶指针
}
void Pop(LinkStack *S){
//出栈操作
StackNode *p=S->top; //保存栈顶指针
if(StackEmpty(S)){
printf("Stack underflow\n"); //下溢,退出运行
return ;
}
S->top=p->next; //将栈顶结点从链上摘下
free(p);
}
Datatype StackTop(LinkStack *S){
//取栈顶元素
if(StackEmpty(S)){ //栈空则无法取栈顶元素
printf("Stack is empty!\n");
return '?';
}
return S->top->data;
}
void CreateStack(LinkStack *S){
//建立一个栈
char ch;
while((ch=getchar())!='\n'){
Push(S,ch);
}
return ;
}
//***********************************测试函数********************************
int main(){
LinkStack S;
InitStack(&S);
printf("输入一个字符串,来建立一个字符顺序栈:\n");
CreateStack(&S);
printf("栈已建好!\n");
printf("栈顶元素是:%c\n",StackTop(&S));
printf("弹出栈顶元素:\n");
Pop(&S);
printf("此时栈顶元素为:%c\n",StackTop(&S));
printf("将元素‘z’进栈:\n");
Push(&S,'z');
printf("此时栈顶元素是:%c\n",StackTop(&S));
return 0;
}
测试样例: