用C 语言编写程序模拟堆栈

//本人所作博客为学习复习所用,如有不对之处还望指出

模拟堆栈

程序设计题目要求:
编写一个程序模拟堆栈,要求能够模拟、入栈、出栈等基本操作。栈中元素可用整数代替。不能使用C++模板库预定义的类型。程序运行中可输入多组入栈、出栈操作,每次操作后展示栈中元素。

思路:该题涉及部分简单数据结构的知识——堆栈。我的思路是:用数组来表示栈,然后用一个指向栈顶的指针,通过自增自减来实现堆栈中元素的操作。并且与用户进行交互来决定接下来的操作是入栈、出栈还是退出程序。

代码如下:

/*
 * 堆栈:一端固定,一端浮动
 * 所有数据的存入或取出,只能在浮动的一端(栈顶)进行 ,严格按照“先进后出”的原则获取 
 * 位于中间的元素,必须在其栈上面的元素(后入栈者)逐个移除后才能取出 
 * 
 */ 
#include<stdio.h>
enum{length=10};//定义枚举常量length表示栈的长度、容量 

int push(int *stack,int len,int *toppointer,int x) 
{//指向表示栈的数组的指针,栈的长度,指向栈顶的指针,入栈的元素 
	if(*toppointer>=len)
	{
		return 1;
	}//超过了栈的长度,栈满
	 
	stack[*toppointer]=x; //把x作为栈顶元素
	(*toppointer)++;
	
	return 0;
}//入栈函数,用于将元素送入栈中 


int pop(int *stack,int *toppointer,int *cp)
{
	if(*toppointer==0)
	{
		return 1;
	}//栈顶指针指向0,说明栈中没有元素,栈空 
	
	(*toppointer)--;
	*cp=stack[*toppointer];//将出栈元素保存 
	
	return 0;
}//出栈函数,用于将栈中的元素送出 


void ShowStack(int *stack,int toppointer)
{
	int i;
	for(i=toppointer-1;i>=0;i--)
	{
		printf("%d\n",stack[i]);
	}
}//自顶向下展示栈中的元素 


void main()
{
	int stack[length];//表示栈的数组 
	int elem;//入栈的元素 
	int top=0;//栈顶 
	int selection;//操作选择 
	while(1)
	{
		printf("请选择,1:入栈,2:出栈,3:退出程序\n");
		scanf("%d",&selection);//输入用户的选择 
		if(selection==3)
		{
			return ;
		}//直接退出程序 
		else if(selection==1)
		{
			printf("请输入进栈元素: ");
			scanf("%d",&elem); //输入入栈元素 
			if(push(stack,length,&top,elem)==0)
			{
				printf("此时栈内元素为:\n");
				ShowStack(stack,top);
				printf("\n");
			}
			else
			{
				printf("栈满\n");
				printf("\n");
			}
		}
		else if(selection==2)
		{
			if(pop(stack,&top,&elem)==0)
			{
				printf("出栈元素为: %d\n",elem);
				printf("此时栈内元素为:\n");
				ShowStack(stack,top);
				printf("\n");
			}
			else
			{
				printf("栈空\n");
				printf("\n");
			}
		}
		else
		{
			printf("输入错误,请重新输入\n");
		}
	}
} 
  • 10
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值