基于顺序存储结构的栈

来源:互联网 发布:短信平台软件 编辑:程序博客网 时间:2024/06/05 20:06

栈也是一种线性结构,如果用一句话介绍栈的话,那就是后进先出(LIFO:Last In First Out)。栈的特性是由于其特殊的存取方式决定的,那就是只能在一端进行存取动作。可以存取的一端一般称为栈顶,另一端称为栈底。究竟栈底索引置为-1还是置为0也是一个讲究,普遍的方法是置为-1,这一点在后面的存取操作中会发现优势。 一般有push和pop操作,以及栈空,栈满等判断。

本文介绍的是基于顺序存储结构的实现,那就是用到了数组,为了更灵活采取的是动态开辟内存空间的形式。栈结构中还有一个top这个俗称栈指针的东西很重要。其实就是一个整型下标索引值。

//在进栈和出栈时 先判断条件是否成立 重中之重#pragma once#include<iostream>using namespace std;template<class T>class Stack{public:int MAXSIZE;//栈最大体积T *arr;//动态空间int top;//类似于指向当前元素的栈指针public:Stack(const int stacksize = 100);//构造函数Stack(const Stack<T>& S);//深复制~Stack();//析构函数void DestroyStack();//销毁栈    void output();//输出栈元素 一次性全部输出栈元素T pop();//出栈void push(T pushelem);//进栈bool isEmpty();//判栈满bool isFull();//判栈空int GetSize();//返回栈元素数int Gettop();};template<class T>int Stack<T>::Gettop(){return top;}template<class T>Stack<T>::Stack(const int stacksize){if(stacksize < 0)//初始化参数 判断{cout<<"非法值"<<endl;exit(1);}MAXSIZE = stacksize;arr = new T[MAXSIZE];top = -1 ;//指针 初始化为-1,此时无元素}//深复制函数template<class T>Stack<T>::Stack(const Stack<T>& S){MAXSIZE = S.MAXSIZE;arr = new T[MAXSIZE];if(arr == NULL){cout<<"内存分配错误"<<endl;exit(1);}int current = S.top ;//不用top指针操作,防止篡改了top值while(current != -1)//复制 直到栈指针指向栈底后一位,跳出循环{arr[current] = S.arr[current] ;current-- ;}top = S.top ;//把top值赋给当前栈}template<class T>Stack<T>::~Stack(){delete []arr ;//连续空间的删除}template<class T>void Stack<T>::DestroyStack(){delete []arr ;//类似于析构函数的作用,在过程中使用}//返回栈最大体积template<class T>int Stack<T>::GetSize(){return MAXSIZE ;}//判栈满template<class T>bool Stack<T>::isFull(){return ((top == MAXSIZE-1) ? true : false);}//判栈空template<class T>bool Stack<T>::isEmpty(){return (( top == -1) ? true : false);}//输入/*template<class T>void Stack<T>::input(){}*///输出template<class T>void Stack<T>::output(){int current = top;//只能从栈顶以此输出while(current != -1){cout<<arr[current]<<endl;current--;}}//压栈template<class T>void Stack<T>::push(T pushelem){if(top == MAXSIZE-1)//栈满,无法压栈操作{cout<<"Stack is full!"<<endl;    return ;}arr[++top] = pushelem ;}//出栈template<class T>T Stack<T>::pop(){if(top == -1)//空栈,无法执行出栈操作{cout<<"Stack is empty!"<<endl;exit(1);}return arr[top--];//只在栈顶的操作,方便快捷,修改top值即可}