栈的定义

栈(stack) 是限定仅在表尾进行插入或删除操作的线性表。因此,对栈来说,表尾端有其特殊含义,称为栈顶(top) ,相应地,表头端称为栈底(bottom) 。不含元素的空表称为空栈。

上图就是栈,只有一个出口(上端) 那么假设我们有4个数字,要进入到这个栈,该怎么进入呢

先进的后出,后进的先出

递归中的栈
#include<iostream>
using namespace std;
void op(int n)
{
	if(n<1) cout<<"1\n";
	else
	{
		cout<<n<<"\n";
		return op(n-1);
		cout<<n<<"\n";
	}
}
int main()
{
	int n;
	cin>>n;
	op(n);
	return 0;
}

指针

如果把计算机的内存看作是一个一个单元格,为每个单元格赋予一个编号,那么这个编号就可以称为内存地址,保存这些编号的变量我们就称之为指针。

指针是C/C++的共同特性之一,指针实现了对变量、常量、对象、函数的间接访问方式,并且指针本身就是一种数据类型,指针拥有其他数据相同的性质——无需在定义时赋初值,可以先后指向不同的对象
它的标志性就是要有一个*
#include<iostream>
using namespace std;
int main()
{
	int a=5;
	int *p=&a;
	cout<<*p;
	return 0;
}
//这段代码执行后是5,因为指针p指向了a
注意事项:
想要获取该地址,需要使用取地址符号(&)
如果想要输出该地址要加*
去掉*就是0xXXXX
如果指针值被修改,则被指向的值也被修改,因为指针是永远指向-那个-被指向的-数的
原值修改也会导致指针被修改
例题:现在要求使用指针为中间数,把a和b的值交换
#include<iostream>
using namespace std;
int main()
{
	int a=5,b=2,num1=0,num=0;
	int *n=&a,*m=&b;
	num=a;
	num1=b;
	b=num;
	a=num1;
	cout<<a<<" "<<b;
	return 0;
}

/* 用指针模拟栈的几种基本操作 栈的操作有以下几种:(自己写的,有增加了几个)

判断是否为空(empty)
首位数字出栈(pop)
加进一个数入栈(push)
取首位数字(top)
事先准备两个指针,分别是top和end,首和尾,在给一个数组,用来给指针赋值
两个指针的值一样
全局变量
*/
int stack[]={0};
int *top=stack[sizeof(stack)/sizeof(int)];//不知道为什么这么长
int *end=stack[sizeof(stack)/sizeof(int)];
1
2
3

/* 1,判断是否为空 为什么要给指针赋值呢?这样好判断是否为空 如果top==end,则知道这个栈没有任何东西 empty函数 */ int sempty()//呵呵呵呵,我就不写empty { if(top==end) return 0;//如果首尾一样返回个0 return 1; } 1 2 3 4 5 2,首位数字出栈 出栈默认把最上方的那个数字踢去,不要 如果丢掉一个数字,那么top的值肯定要-1,因为少一个数字那么就剩下了top-1个数字 所以:丢掉一个数字等价于top-1 pop函数

int spop()//...
{
	top--;
}
1
2
3
4
3,加进一个数入栈
有出必有进,所以push函数不可少
上述提到:加*则是地址,不加则是0xXXXX
每加一个数字则有top+1个数字
这时顶端数字便被改变

int spush(int num)
{
	top++;
	*top=num;
}
1
2
3
4
5
4,取首位数字
呵呵呵呵,不要太简单
首先判断一下首位是不是为空,然后再输出

int stop()//stop!停止!
{
	if(sempty()==0) return *top;
	return -1;
}
1
2
3
4
5
完整代码
#include<iostream>
using namespace std;
int stack[]={0};
int *top=&stack[sizeof(stack)/sizeof(int)];
int *end=&stack[sizeof(stack)/sizeof(int)];
int sempty()
{
	if(top==end) return 1;
	return 0;
}
int stop()
{
	if(sempty()==0) return *top;
	return -1;
}
int sszie()
{
	return top-end;
}
int spop() 
{
	top--;
}
int spush(int num)
{
	top++;
	*top=num;
}
int main()
{
	int s;
	cin>>s;
	spush(10);
	spush(s);
	spop();
	cout<<stop();
	return 0;
}