栈是先进后出的一种存储类型,很常见也很常用。用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库的话可以使用图形界面,效果更好。
运行截图: