后进先出(LIFO)或者先进后出(FILO)
栈顶、栈底之分
操作:PUSH TOP POP ISEMPTY;
下面是代码:
#ifndef _MYSTACK_H__
#define _MYSTACK_H__
template <class T>
class MyStack
{
public:
MyStack(int StackCapacity=10); //构造函数 默认大小为10
~MyStack(); //析构函数
bool isEmpty() const; //检查是否为空
T& Top() const; //获取最顶层的值
void Push(const T& item); //压栈
void Pop(); //出栈
void ChangSize(T *&a,const int oldSize,const int NewSize); //*&表示指针的引用 既能改变指针指向的内容,又能改变指向的地址
int length();
private:
T *Stack;
int top;
int capacity;
};
template<class T>
MyStack<T>::MyStack(int StackCapacity):capacity(StackCapacity) //初始化堆栈
{
if(StackCapacity<1)
throw "Error Capacity must be >0";
Stack=new T[StackCapacity]; //动态创建栈
top=-1; //Top的
}
template <class T>
bool MyStack<T>::isEmpty() const
{
if(top==-1)
return true; //-1为空 返回1
else
return false; //否则返回0
}
template<class T>
MyStack<T>::~MyStack() //析构函数
{
delete []Stack;
}
template <class T>
void MyStack<T>::ChangSize(T *&a,const int oldSize,const int NewSiz)//增加空间
{
if(NewSiz<0)
throw "New Length must be >=0"; //抛出异常
if(NewSiz<=oldSize)
throw "New Length must be > oldSize";
T *temp=new T[NewSiz]; //创建一个临时的对象 分配newsize大小的空间
copy(a,a+oldSize,temp); //把旧空间的元素全部复制到temp里面
delete []a; //释放a的内存空间
a=temp;
}
template <class T>
T &MyStack<T>::Top() const
{
if(isEmpty()) throw "Stack Empty!";
return Stack[top]; //返回栈顶的值
}
template<class T>
void MyStack<T>::Push(const T& item) //压栈
{
if(top==capacity) //检查栈有没有满
{
ChangSize(Stack,capacity,capacity*2); //增加2倍大小
top++;
Stack[top]=item; //把值放进去
}
else
Stack[++top]=item; //把值放进去
}
template <class T>
void MyStack<T>::Pop() //出栈
{
if(isEmpty()) throw"Stack is empty,can not pop";
Stack[top--].~T(); //释放
}
template<class T>
int MyStack<T>::length() //返回栈的大小
{
return capacity;
}
#endif // _MYSTACK_H__
main:
#include <iostream>
#include "MyStack.h"
using namespace std;
int main()
{
MyStack<int> Stack1;
Stack1.Push(10);
Stack1.Push(11);
Stack1.Push(8);
Stack1.Push(5);
for(int i=0;i<Stack1.length();i++)
{
cout<<Stack1.Top()<<" ";
Stack1.Pop();
}
//cout << "Hello world!" << endl;
return 0;
}