C语言如何实现模拟栈

版权声明:转载请注明出处! https://blog.csdn.net/ZouHuiDong/article/details/90343026

栈是先进后出的一种存储类型,很常见也很常用。用C语言实现一个栈很简单,只需要一个数组和一个int变量就可以了。

一个简单的栈

需要什么

  • 一个char型数组——用于模拟栈
  • 一个int变量——用于保存栈顶的位置
char Value[12];//一个大小为12的栈
int Head;//用于保存栈顶的位置

实现简单的操作

  • 实现在栈顶添加值
  • 实现提取(删去)栈顶的值

要添加值,只需要在栈顶加入值,并将栈顶加1即可。

//添加值,假如要添加chNew的值
char chNew;
scanf("%c",&chNew);//得到要添加的值

chValue[Head] = chNew;//添加值
Head ++;//栈顶上移

同理,要提取或删去值,只需要减去栈顶下面一个值(因为栈顶Head是在栈中最上面一个值的上面),并将栈顶减1即可。

//如果要提取出来就先把栈顶的值存到另外一个变量里(如果提取出来只需要显示一下就不需要再多创建一个变量):
char chGet = chValue[Head-1];
printf("你提取出来的值:%c",chGet);
///////////////////////////////////////////////////////
chValue[Head-1] = 0;//删去值
Head --;//栈顶下移

也可以判断栈是否达到上限或下限:

//在插入时判断是否达到上限:
if(Head>=12)//因为栈的大小是12,可根据不同需要来更改
{
	printf("栈已满,不可以继续添加!");
	return ;//不再往下执行
}

//在删去时判断是否达到下限:
if(Head==0)
{
	printf("栈已空,不可以继续删除!");
	return ;//不再往下执行
}

一个更完美的程序

要实现一个更完美的模拟栈的程序,总结出我们需要:

  • 一个更和蔼的主界面,显示栈的情况
  • 在主界面等待用户决定对栈进行什么操作
  • 增加和删除功能

代码:

#include <conio.h>
#include <windows.h>
#include <stdio.h>
#include <graphics.h>

struct stack //结构体 栈
{
	char chStack[12];//栈的数组
	int head;//栈的头
};

struct stack Stack;//创建栈

void Print(char chValue[12])//打印界面
{
	system("cls");
	printf("这是栈:");
	int i;
	for (i=11;i>=0;i--)
		printf("\n[%c]",chValue[i]);
	printf("\n\n按i增加数值,按p弹出最上面的数值");
}

void getinput()//获取用户输入
{
	char chGet;
	while (1)
	{
		if (kbhit())//如果发现用户有按下按键
		{
			chGet = getch();//得到用户按下的按键
			char chValue[1];
			if (chGet == 'i')//如果是i,增加值
			{
				if (Stack.head >= 12)//如果达到上限,不能再加
				{
					MessageBox(NULL,"已经是栈顶了!","提示",MB_OK);
					return;
				}
				//询问要增加的值
				InputBox(chValue,2,"请输入要增加的字符","增加数值",NULL,0,0,true);
				Stack.chStack[Stack.head] = chValue[0];//增加值
				Stack.head ++;//栈顶上移
			}
			else if (chGet == 'p')//如果是p,删除值
			{
				if (Stack.head == 0)//如果已经到下限,就不能再减
				{
					MessageBox(NULL,"已经是栈底了!","提示",MB_OK);
					return;
				}
				Stack.chStack[Stack.head-1] = 0;//移除值
				Stack.head --;//栈顶下移
			}
			return;
		}
	}
	
}

int main()
{
	system("title 模拟栈程序");
	//初始化
	int i;
	for (i=0;i<12;i++)
		Stack.chStack[i] = 0;	
	Stack.head = 0;
	
	while (1)
	{
		Print(Stack.chStack);
		getinput();
	}
	
	getch();
	return 0;
}

注意:<graphics.h>并不是自带的头文件。这是EasyX库的头文件,可以到 www.easyx.cn 下载。代码中MessageBox和InputBox用到了这个头文件,可以自行替换成其他。但是如果使用EasyX库的话可以使用图形界面,效果更好。

运行截图:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ZouHuiDong/article/details/90343026