#include<stdio.h>//标准的输入输出文件
#include<stdlib.h>//使用system函数
#include<Windows.h>
#include<time.h>
#include<string.h>
#include<math.h>
#include<limits.h>
#define N 100 //定义一个常量N 为100
/*栈,上端开放,下端封闭,只能有2个操作,进栈和出栈,进栈和出栈的特点,先进栈的压倒下方,越后进栈的在上方,栈的容量有限,在压一个,
就会发生栈溢出,接下来如何自己实现一个栈呢?*/
//定义一个栈的结构体,先用数组实现一个栈
struct stack
{
int top;//整数,统计栈中多少个元素,data[top]是栈顶
int data[N];//数组,用于存放数据
};
struct stack mystack = { -1, {0} };//为这个结构体创建结构体变量,初始化
//-1代表栈中没有元素,{0}将数组全部初始化为0
//接下来,要实现一个栈,有哪些工作要做呢?需要实现2个函数isempty()和setempty();
int isempty();//判定一下栈是否为空
int setempty();//设置栈为空
int push(int data);//创建一函数需要压入一数据
int pop();//需要取出一数据
//接下来想想,我们实现这4个函数,我们是不是实现一个栈呢?接下来,挨个实现它,先判定一个栈是否为空,
int isempty()//1代表栈为空,0代表不为空,0就是取反的意思,1就是确定isempty就是空,怎么判定,判断
{
if (mystack.top==-1)//-1代表没有元素
{
return 1;//就为空
}
else{
return 0;
}
}
int setempty()//可以是void类型,也可以是int类型
{
mystack.top = -1;//设置栈为空
}
int push(int data)//压入数据分俩种情况,如果栈没有溢出时候,我们就可以压入数据,如果栈溢出时候,我们就失败了,需要判定一下,成功返回1,失败返回0
{
//成功返回1,失败返回0。0就代表栈溢出
//top等价于数组的小标
if (mystack.top+1<=N-1)//没有发生栈溢出,否则会发生栈溢出
{
mystack.data[mystack.top + 1] = data;//数组上升一个,接收新的数据
mystack.top += 1;//下标就需要向前移动一位
return 1;
}
else{
return 0;//栈溢出
}
}
int pop()//压出数据,要分为空和不为空2中情况,
{
//容错性判断,避免为空了继续弹出数据,数组越界会导致程序崩溃
if (isempty()==0)//只有不为空才可以弹出数据,1代表栈为空,0代表不为空
{
mystack.top -= 1;//下标减1
return mystack.data[mystack.top + 1];//弹出一个数据
}
else
{
return -1;//为空返回-1;
}
}
//上面就实现了栈这样一个数据结构
void main1()//用数组实现的栈
{
//先实现一功能,逆序输出
int a[10] = {1,2,3,4,5,6,7,8,9,10};
for (int i = 0; i < 10;i++)
{
push(a[i]);//实现压入数据
}
//接下来,判断,只要不为空的情况下,打印出弹出数据
while (isempty()!= 1)//isempty() != 1的情况下,就可以继续下去
{
printf("%d\n",pop());//打印弹出的数据
}
system("pause");
}
//大家思考一下,我们也可以用栈来逆序排列,实现递归所实现的东西,下面举例如何用栈来实现递归呢?
/栈有什么作用呢?栈实际可以模拟递归,看下面例子
//将10进制数据转换成二进制数据 10->1010,原理即使不断除以2取出余数,不能用循环来实现,因为循环是正序排列,递归是逆序排列。大家思考一下,我们也可以用栈来逆序排列,实现递归所实现的东西
void tenTotwo(int n)//tenTotwo:十进制转二进制,n转换为二进制
{
if (n==0)//递归的标准形式
{
//n=的情况下,没有必要继续
}
else{
int m = n % 2;//取出余数
tenTotwo(n / 2);//用递归的方式调用,不断除以2
printf("%d",m);//递归调用之后实际上就是逆序
}
}
void main2()
{
tenTotwo(100);//递归调用,逆序输出
system("pause");
}
//用栈实现了递归实现的逆序,递归可以实现顺序和逆序,我们用栈的模式实现了把一个整数换成2进制,并且实现了逆序,我们用循环实现了正序,用循环配合栈实现了逆序
void main()
{
//没有用栈的情况下用循环会出现什么情况呢?结果是0010011,正序,如何把它变成逆序呢?这个后死后就要用到栈
int num = 100;//切换为2进制
//循环实现顺序,压栈实现了逆序
while (num)//等价于num==0就停止循环
{
//printf("%d", num % 2);
push(num%2);//压栈,接下来就需要出栈,需要做个判断
num /= 2;
}
while (!isempty())//isempty部位空情况下继续,判断栈不为空,就一直出栈
{
printf("%d", pop());//不断让数据出栈
}
//用栈实现了递归实现的逆序
system("pause");
}