C++数据结构 8 顺序栈

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014183456/article/details/83006968

后进先出(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;
}

猜你喜欢

转载自blog.csdn.net/u014183456/article/details/83006968