链栈的基本操作

链栈的基本运算

  • 前面说了顺序栈的操作,下面给大家说的是链栈的一些操作,和顺序栈类似,大家可以对比学习。
  • 祝大家学业有成,早日学会编程

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;
}

效果展示

在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值