栈的链式存储类型
typedef struct Linknode{
int data;
struct Linknode *next;
}Linknode,*LiStack;
代码实现
(1)初始化栈
bool InistLiStack(LiStack &S){//初始化
S = new Linknode;//创建一个新的节点
if(S == NULL)
return false; //若S为空,返回false
S->next = NULL; //令S的next指针指向NULL
return true;
}
(2)进栈
void PushLiStack(LiStack &S,int e){//进栈
Linknode *p = (Linknode *)malloc(sizeof(Linknode));
p->data = e; //将e的值赋给p->data
p->next = S; //令p的next指针指向S
S = p; //再将S指针放到p节点
printf("插入成功\n");
}
创建一个新的节点并分配空间,
(3)出栈
void PopLiStack(LiStack &S){//出栈
if(S->next == NULL)
printf("栈为空\n");
Linknode *p = (Linknode *)malloc(sizeof(Linknode));
p = S;
S = S->next;
free(p);
printf("出栈成功\n");
}
(4)取栈顶元素
void GetTop(LiStack S){//取栈顶元素
int e;
if(S->next == NULL)
printf("栈为空");
else{
e = S->data;
printf("栈顶元素为:%d\n",e);
}
}
(5)求链栈长度
int LengthLiStack(LiStack S){//链栈长度
int len=0;//定义变量存储长度
Linknode *p = S;
while(p->next!=NULL){
p = p->next;
len++;
}
return len;
}
(6)完整代码
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
typedef struct Linknode{
int data;
struct Linknode *next;
}Linknode,*LiStack;
bool InistLiStack(LiStack &S){//初始化
S = new Linknode;
if(S == NULL)
return false;
S->next = NULL;
return true;
}
void PushLiStack(LiStack &S,int e){//进栈
Linknode *p = (Linknode *)malloc(sizeof(Linknode));
p->data = e;
p->next = S;
S = p;
printf("插入成功\n");
}
void PopLiStack(LiStack &S){//出栈
if(S->next == NULL)
printf("栈为空\n");
Linknode *p = (Linknode *)malloc(sizeof(Linknode));
p = S;
S = S->next;
free(p);
printf("出栈成功\n");
}
void GetTop(LiStack S){//取栈顶元素
int e;
if(S->next == NULL)
printf("栈为空");
else{
e = S->data;
printf("栈顶元素为:%d\n",e);
}
}
void ScanfLiStack(LiStack &S){//连续进栈
int x,i=1;
Linknode *p;
p = S;
printf("请输入你要入链栈的元素(-1退出):");
scanf("%d",&x);
while(x!=-1){
p = (Linknode *)malloc(sizeof(Linknode));
p->data = x;
p->next = S;
S = p;
i++;
printf("第%d个元素:",i);
scanf("%d",&x);
}
}
int LengthLiStack(LiStack S){//链栈长度
int len=0;//定义变量存储长度
Linknode *p = S;
while(p->next!=NULL){
p = p->next;
len++;
}
return len;
}
void Printf(LiStack S){//按出栈顺序输出
Linknode *p = S;
while(p->next!=NULL){
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
void Empty(LiStack &S){//判空
if(S->next==NULL)
printf("此链表为空\n");
else
printf("此链表有元素,见操作6\n");
}
int main(){
LiStack S;
int i;
printf("======================================\n");
printf("1.初始化栈 2.进栈\n");
printf("3.连续进栈 4.读栈顶元素\n");
printf("5.出栈 6.按出栈顺序输出\n");
printf("7.链表长度 0.退出\n");
printf("======================================\n");
while(1){
printf("请输入要进行的操作:");
scanf("%d",&i);
switch(i){
case 1:InistLiStack(S);
printf("初始化成功\n");
break;
case 2:int e;
printf("请输入进栈元素:");
scanf("%d",&e);
PushLiStack(S,e);
break;
case 3:ScanfLiStack(S);
printf("全部元素进栈完成\n");
break;
case 4:GetTop(S);
break;
case 5:PopLiStack(S);
break;
case 6:printf("栈中元素按出栈顺序为:");
Printf(S);
break;
case 7:printf("链表长度为%d\n",LengthLiStack(S));
break;
case 0:exit(1);
break;
default:printf("输入错误,请重新输入:\n");
break;
}
}
return 0;
}