在计算机科学中,堆栈作为元素的集合是一种抽象数据类型,有两个主要操作:
- 推送,它将元素添加到集合中。
- pop,移除最近添加的尚未移除的元素。
元素从堆栈中取出的顺序产生了它的另一个名字,叫做后进先出。此外,查看操作可以在不修改堆栈的情况下访问顶部。[1] 这种结构的名称“堆栈”来源于一组堆叠在一起的物理项目的类比,这使得从堆栈顶部取出一个项目变得容易,而到达堆栈中更深处的项目可能需要先取出多个上层的其他项目。[2]
推送和弹出操作被视为线性数据结构,或者更抽象地说是顺序集合,只发生在结构的一端,即堆栈的顶部。这使得将堆栈实现为单个链表和指向顶部元素的指针成为可能。堆栈可以被实现为具有有限容量的空间。如果堆栈已满,并且没有足够的空间接受要推送的实体,则堆栈被认为处于溢出状态。弹出操作从堆栈顶部移除一个项目
总代码
#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
class my_Stack{
private:
int* data; //存放栈中的数据
int maxsize; //栈的最大空间
int num; //栈内成员数量
int top; //栈顶
int low; //栈底
public:
//初始化栈,分配内存,最大空间
void initStack()
{
data = new int[maxsize];//给栈中数据分配空间
top = -1; //初始化栈顶
num=0;
}
//设置最大空间
my_Stack(int max_size) {
maxsize = max_size;
initStack();
}
//调用析构,对用完的空间进行释放
~my_Stack()
{
delete data;
}
//拷贝构造
my_Stack( const my_Stack& other)
{
//计算原空间尺寸
int len =other.num;
int size=other.maxsize;
this->data=new int[size];
memcpy(this->data,other.data,len*sizeof(int));
}
//判空
int Empty()
{
return (top == -1)?1:0; //1表示栈空,0表示栈非空
}
//判满
int Full()
{
return (top >= maxsize-1)?1:0; //1表示栈满,0表示栈非满
}
//栈增加
void greater()
{
int *temp =new int[1+num];
memcpy(temp,this->data,(num+1)*sizeof(int));
delete []data;
data=temp;
}
//进栈
int push_stack(int x)
{
if(Full()==1)
{
//cout<< "满了傻逼"<<endl;
greater();
}
//cout<<"11111"<<endl;
data[++top] = x;//top初始为-1,所以先+1然后在存入数据
num++;
return 1;
}
//出栈
int pop_stack()
{
int x;
if(Empty()==1)
{
cout<<"栈空,无法出栈"<<endl;
return 0;
}
else
{
x = data[top--]; //直接将数据清除
num--;
}
return x;
}
};
int main()
{
my_Stack stack(10);
// stack.push_stack(111);
// stack.push_stack(222);
// stack.push_stack(333);
// stack.push_stack(444);
// stack.push_stack(555);
// stack.push_stack(666);
int a;
for(int i=1;i<=15;i++)
{
stack.push_stack(i);
}
while (a = stack.pop_stack())
{
cout<<a<<endl;
}
return 0;
}