数据结构——栈的初始化、入栈、出栈

 

 

#include "iostream"
using namespace std;
#define STACK_INIT_SIZE 5  //存储空间初试分配量
#define STACKINCREAMENT 10   //存储空间分配增量

//当分配空间地址有MAXLEN个的时候,
//内存空间范围为[0,MAXLEN-1];
//使得base = 0,top = MAXLEN-1;
//初始化top = base = 0
//因为在Push的操作中,每次完了之后都是使得top++;
//如果top==MAXLEN-1的时候,完成之后就会执行top++,这个时候其实top已经在预分配内存之外了
//所以才有了下一步(top-base>=base),从而实现了动态分配
//a)非空栈 top>=1,栈顶元素=s[top-1]
//b)进出栈说明:
//	进栈:现将数据放入top的位置,然后top++
//	出栈:先top--,然后在取出元素
//c)满栈条件 top == MAXLEN,若此时插入元素则会溢出
//d)空栈条件 top == base ==0 ,若此时删除元素,将会发生下溢



typedef struct {
	int *base;//栈底指针
	int *top;//栈顶指针,栈顶永远处于比数据高的一个位置
	int stacksize;
}SqStack;
void InitStack(SqStack &S);
void Push(SqStack &S,int element);
void Pop(SqStack &S);
void main()
{
	SqStack S;
	InitStack(S);
	for (int i = 0;i<10;i++)
	{
		Push(S,i);

	}
	Pop(S);


}
void InitStack(SqStack &S){
	S.base = (int *)malloc(STACK_INIT_SIZE*sizeof(int));
	if (!S.base)
	{
		exit(0);//分配内存失败,程序退出
	}
	S.top = S.base;
	S.stacksize = STACK_INIT_SIZE;
}
void Push(SqStack &S,int element){
	if (S.top-S.base>=S.stacksize)//判断是否栈溢出
	{
		S.base = (int *)realloc(S.base,(S.stacksize+STACKINCREAMENT)*sizeof(int));
		if (!S.base)
		{
			
			exit(0);//分配内存失败,程序退出
		}

		S.top = S.base+S.stacksize;
		S.stacksize+=STACKINCREAMENT;
	}
	*S.top++ = element;
}
void Pop(SqStack &S){
	//当栈顶和栈底相同时,若删除原始,将会发生“下溢”
	if (S.top==S.base)
	{
		exit(0);
	}
	int element = *--S.top;
	cout<

 

你可能感兴趣的:(数据结构)