链栈的基本运算
- 前面说了顺序栈的操作,下面给大家说的是链栈的一些操作,和顺序栈类似,大家可以对比学习。
- 祝大家学业有成,早日学会编程
1.链栈类型定义
typedef struct Linknode
{ ElemType data; //数据域
struct Linknode *next; //指针域
} LinkStNode;
2.链栈的基本六个算法
1.初始化
void InitStrack(LinkStNode *&s)
{ s=(LinkStNode*)malloc(sizeof(LinkStNode));
s->next=NULL;
}
2.销毁
void DestroyStack(LinkStNode *&s)
{
LinkStNode *p=s,*q=s->next;//定义一对指针对,方便遍历栈里的元素
while (q!=NULL)//q不为NULL,释放p
{ free(p);
p=q;
q=p->next;
}
free(p); //此时p指向尾结点,释放其空间
}
3.判断是否为空
bool StackEmpty(LinkStNode *s)
{
return(s->next==NULL);//为空返回1,不为空返回0
}
4.进栈
void Push(LinkStNode *&s,ElemType e)
{ LinkStNode *p;
p=(LinkStNode *)malloc(sizeof(LinkStNode));
p->data=e; //新建元素e对应的结点*p
p->next=s->next; //插入*p结点作为开始结点
s->next=p;
}
5.出栈
bool Pop(LinkStNode *&s,ElemType &e)
{ LinkStNode *p;
if (s->next==NULL) //栈空的情况
return false;
p=s->next; //p指向开始结点
e=p->data;
s->next=p->next; //删除*p结点
free(p); //释放*p结点
return true;
}
6.取栈顶元素
int GetTop(LinkStNode *s,ElemType &e)
{ if (s->next==NULL) //栈空的情况
return false;
e=s->next->data;//栈不为空,将值赋给e,并返回e的值
return e;
}
3.输出函数和菜单
1.输出显示
void Display(LinkStNode *s)
{
LinkStNode *p=s->next;//定义一个指针,指向第一个元素
while(p->next!=NULL)
{
printf("%d ",p->data);//p不为空,输出p的数据
p=p->next;//p后移
}
printf("%d ",p->data);
printf("\n");
}
2.菜单
void meun()//菜单
{
printf("==================================\n");
printf(" 1.进栈\n");
printf(" 2.出栈\n");
printf(" 3.取栈顶元素\n");
printf(" 4.退出\n");
printf("==================================\n");
}
主函数
int main()
{
LinkStNode *L;
int e,length,i,x;
int n;
printf("输入栈的长度\n");
scanf("%d",&length);
InitStrack(L);
printf("输入栈的元素\n");
for(i=0;i<length;i++)
{
scanf("%d",&e);
Push(L,e);
}
printf("创建的栈表为:");
Display(L);
meun();
while(x!=4)
{
printf("选择要进行的操作:\n");
scanf("%d",&x);
switch(x)
{
case 1:
printf("输入进栈的元素\n");
scanf("%d",&e);
Push(L,e);
Display(L);
break;
case 2:
n=GetTop(L,n);
printf("出栈顺序为:\n");
for(i=0;i<=length;i++)
{
Pop(L,n);
printf("%d ",n);
}
printf("\n");
break;
case 3:
printf("栈顶元素为%d\n",GetTop(L,n));
break;
default:
break;
}
}
return 0;
}
- 大家可以尝试将主函数变得简单。这有利于大型软件的开发编程。
所有函数(可以直接运行)
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct Linknode
{ ElemType data; //数据域
struct Linknode *next; //指针域
} LinkStNode;
void InitStrack(LinkStNode *&s)
{ s=(LinkStNode*)malloc(sizeof(LinkStNode));
s->next=NULL;
}
void DestroyStack(LinkStNode *&s)
{
LinkStNode *p=s,*q=s->next;
while (q!=NULL)
{ free(p);
p=q;
q=p->next;
}
free(p); //此时p指向尾结点,释放其空间
}
bool StackEmpty(LinkStNode *s)
{
return(s->next==NULL);
}
void Push(LinkStNode *&s,ElemType e)
{ LinkStNode *p;
p=(LinkStNode *)malloc(sizeof(LinkStNode));
p->data=e; //新建元素e对应的结点*p
p->next=s->next; //插入*p结点作为开始结点
s->next=p;
}
bool Pop(LinkStNode *&s,ElemType &e)
{ LinkStNode *p;
if (s->next==NULL) //栈空的情况
return false;
p=s->next; //p指向开始结点
e=p->data;
s->next=p->next; //删除*p结点
free(p); //释放*p结点
return true;
}
int GetTop(LinkStNode *s,ElemType &e)
{ if (s->next==NULL) //栈空的情况
return false;
e=s->next->data;
return e;
}
void Display(LinkStNode *s)
{
LinkStNode *p=s->next;
while(p->next!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("%d ",p->data);
printf("\n");
}
void meun()//菜单
{
printf("==================================\n");
printf(" 1.进栈\n");
printf(" 2.出栈\n");
printf(" 3.取栈顶元素\n");
printf(" 4.退出\n");
printf("==================================\n");
}
int main()
{
LinkStNode *L;
int e,length,i,x;
int n;
printf("输入栈的长度\n");
scanf("%d",&length);
InitStrack(L);
printf("输入栈的元素\n");
for(i=0;i<length;i++)
{
scanf("%d",&e);
Push(L,e);
}
printf("创建的栈表为:");
Display(L);
meun();
while(x!=4)
{
printf("选择要进行的操作:\n");
scanf("%d",&x);
switch(x)
{
case 1:
printf("输入进栈的元素\n");
scanf("%d",&e);
Push(L,e);
Display(L);
break;
case 2:
n=GetTop(L,n);
printf("出栈顺序为:\n");
for(i=0;i<=length;i++)
{
Pop(L,n);
printf("%d ",n);
}
printf("\n");
break;
case 3:
printf("栈顶元素为%d\n",GetTop(L,n));
break;
default:
break;
}
}
return 0;
}