目录
1.链栈类型定义
1.1结点类型定义
typedef struct LNode{
int elem;
struct LNode *next;
}LNode;
1.2栈类型定义
typedef struct{
LNode *top;//栈顶指针
}LinkStack;
2.初始化链栈
void InitStack(LinkStack &S){//初始化
S.top=(LNode*)malloc(sizeof(LNode)); //为栈顶指针分配空间
S.top->next=NULL;
S.top->elem=NULL;
}
3.入栈
void Push(LinkStack &S,int x){//入栈
LNode *p=(LNode*)malloc(sizeof(LNode)); //建立新结点
p->elem=x;
p->next=S.top; //新结点插入链表头
S.top=p; //栈顶指针移至新栈顶
}
4.出栈
bool Pop(LinkStack &S,int &x){//出栈
LNode *q=S.top; //辅助指针
if(S.top->next==NULL)
return false;
x=q->elem; //获取栈顶元素
S.top=q->next; //栈顶指针移向下一结点
q->next=NULL; //断链
free(q);
return false;
}
5.遍历输出栈内所有元素
void PrintStack(LinkStack S){ //输出
LNode *q=S.top; //遍历指针
for(;;){
if(!q->next)
break;
printf("%4d",q->elem);
q=q->next;
}
printf("\n");
}
6.查看栈顶元素
bool Top(LinkStack S,int &x){ //查看栈顶元素
if(S.top==NULL)
return false;
x=S.top->elem;
return true;
}
7.完整代码
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode{
int elem;
struct LNode *next;
}LNode;
typedef struct{
LNode *top;//栈顶指针
}LinkStack;
void InitStack(LinkStack &S){//初始化
S.top=(LNode*)malloc(sizeof(LNode)); //为栈顶指针分配空间
S.top->next=NULL;
S.top->elem=NULL;
}
void Push(LinkStack &S,int x){//入栈
LNode *p=(LNode*)malloc(sizeof(LNode)); //建立新结点
p->elem=x;
p->next=S.top; //新结点插入链表头
S.top=p; //栈顶指针移至新栈顶
}
bool Pop(LinkStack &S,int &x){//出栈
LNode *q=S.top; //辅助指针
if(S.top->next==NULL)
return false;
x=q->elem; //获取栈顶元素
S.top=q->next; //栈顶指针移向下一结点
q->next=NULL; //断链
free(q);
return false;
}
void PrintStack(LinkStack S){ //输出
LNode *q=S.top; //遍历指针
for(;;){
if(!q->next)
break;
printf("%4d",q->elem);
q=q->next;
}
printf("\n");
}
bool Top(LinkStack S,int &x){ //查看栈顶元素
if(S.top==NULL)
return false;
x=S.top->elem;
return true;
}
int main(){
LinkStack S;
InitStack(S);
int x;
for(;;){
scanf("%d",&x);
if(x==-1)
break;
Push(S,x);
}
PrintStack(S);
Pop(S,x);
PrintStack(S);
printf("pop elem:%d\n",x);
Top(S,x);
printf("top elem:%d\n",x);
return 0;
}
8.总结
结点数据类型和链栈数据类型
链栈有其本身的数据结构:一根链带一个栈顶指针,因此需要建立两个结构体数据类型,一个结构体描述链结点数据结构,一个结构体描述链的数据结构
.和->的区别:
"."获取结构体对象的子项,面向结构体对象。
"->"获取结构体指针的子项,面向结构体指针
即S为一个栈类型的结构体实例,获取其子项top使用".",S.top和p、q为一个结点类型的结构体指针,获取其子项elem和next使用"->"