一个模板定长数组栈
为了以后方便使用,可以把代码放在Stack.h文件中。
#include<iostream>
using namespace std;
template<class T>
class Stack
{
public:
Stack(int Size);
~Stack();
bool stack_empty();//判空
bool stack_full();//判满
bool push(T element);//入栈
bool pop(T &element);//出栈
void stack_clear();//清空栈
void traverse();//遍历
private:
T* data;
int Size;
int lenght;
int top;
};
//初始化栈
template<class T>
Stack<T>::Stack(int Size)
{
this->Size=Size;
data=new T[Size];
lenght=0;
top=0;
}
//销毁栈
template<class T>
Stack<T>::~Stack()
{
delete []data;
}
//判空
template<class T>
bool Stack<T>::stack_empty()
{
return top==0?true:false;
}
//判满
template<class T>
bool Stack<T>::stack_full()
{
return top==Size?true:false;
}
//入栈
template<class T>
bool Stack<T>::push(T element)
{
if(stack_full()) return false;
data[top]=element;
top++;
lenght++;
return true;
}
//出栈
template<class T>
bool Stack<T>::pop(T &element)//传入引用的目的是可以把出栈的元素取出来,相当于取栈首元素
{
if(stack_empty()) return false;
top--;
element=data[top];
lenght--;
return true;
}
//清空栈
template<class T>
void Stack<T>::stack_clear()
{
//将栈的长度清0,栈顶指向0;
lenght=0;
top=0;
}
//遍历栈
template<class T>
void Stack<T>::traverse()
{
for(int i=0;i<top;i++)
cout<<data[i]<<" ";
cout<<endl;
}
可以把上述文件引入主文件中进行操作。
这是一个简单的小演示
#include <iostream>
#include"Stack.h"
#include<stdlib.h>
using namespace std;
int main()
{
int Size;//定义栈的长度
cin>>Size;
Stack<int> mystack(Size);//在<>中填写栈中元素的数据类型
int x;
for(int i=0;i<Size;i++)
{
x=rand()%100;//产生一个100以内随机数
mystack.push(x);//将产生的随机数入栈
}
mystack.traverse();//清空栈,未清空前栈内有25个元素,清空后元素为0;
for(int i=0;i<Size/2;i++)
{
mystack.pop(x);//将栈顶元素取出,取出后存入在变量x中,因为传入的参数是引用
mystack.traverse();//每取出一个元素打印一遍当前栈
}
return 0;
}
演示结果如图所示
关于清空栈的操作:
每一个内存地址中都有值,赋值并不是给没有值的内存赋一个值而是用当前值覆盖以前的值,所以清空栈并不需要更改原来内存的值,只需要更改栈的长度和栈顶,内存中的值可以在后续的操作中覆盖。