#include <iostream>
#include <cstdlib>
#define N 10
#define STACK_MAX_SIZE 20
using namespace std;
//方法2
//栈的初始化,压栈,出栈,清空栈等操作
//本质介于静态栈和动态栈之间的一种表示方法
typedef struct
{
int *base; //指向栈底的指针,存放int型数组
int *top; //指向栈顶的指针,存放int型数组
int stackSize; //该栈当前可使用的最大容量
}Stack;
/**************初始化一个空栈***********************/
void initStack( Stack &s)
{
s.base= new int[STACK_MAX_SIZE]; //等同s.base=(int *)malloc(STACK_MAX_SIZE*sizeof(int));
if( !s.base )
{
cout<<"内存分配失败!!!"<<endl;
exit(0);
}
s.top = s.base ; //刚开始时候,栈顶和栈底在同一个位置。
s.stackSize = 0 ; //初始时候,该栈当前的元素个数0
}
/**************元素进栈***********************/
void push(Stack &s ,int e)
{
if(s.top - s.base >= STACK_MAX_SIZE) //要存数据进来,先判断,容量是否满了
cout<<"栈满了!!!"<<endl;
else
{
*s.top = e ; //*s->top的意思是,读取s->top这个指针所指向的地址上存放的值,然后把e赋给这个值
s.top ++ ; //e存放进去后,top指针上移,这时候base指针指向栈底,top指针指向下一个可存放的位置(即栈顶)
s.stackSize++;//栈的元素个数+1
}
}
/**************元素出栈***********************/
void pop(Stack &s , int &e)
{
if(s.top == s.base) //判断是否为空栈
return;
s.top--;
e = *s.top; //因为若是非空的栈,则他的s->top指向下一个可以存放数据的地址,
//此时这个位置是空的,他的下面才是最后一个有数据的
}
/**************显示栈元素***********************/
void show(Stack &s)
{
if(s.top == s.base)
cout<<"栈是空的"<<endl;
else
{
int *p = s.top; //指针p在栈顶位置
while(p != s.base) //显示栈靠p移动
{
p--;
cout<<*p<<" ";
}
cout<<endl;
}
}
/**************清空一个栈**********************/
void clearStack(Stack &s)
{ //这是个虚假的清除栈,其实那些文件还是在的
//下次调用这个栈的时候,新存入数据会把旧的覆盖掉
s.top = s.base;
}
/**************销毁一个栈**********************/
void destroyStack(Stack &s)
{ //对比上面那个清理,这个才是销毁
int i , len;
len = s.stackSize;
for(i = 0 ; i < len ; i++)
{ //从下往上销毁
free(s.base);
s.base ++ ;
}//销毁完毕
s.base = s.top = NULL;
s.stackSize = 0;
}
int main()
{
//创建并初始化栈
Stack s;
initStack(s);
//元素压栈
for(int i=1;i<15;i++)
push(s,i);
//元素出栈
int e;
pop(s ,e);
//销毁栈
destroyStack(s);
//显示栈
show(s);
return 0;
}
C++数据结构-栈的初始化及其压栈和出栈-方法2
最新推荐文章于 2024-04-29 17:02:10 发布