顺序栈


栈(stack)又名堆栈,它是一种运算受限的线性表(栈、队列、线性表其逻辑结构均是线性的,栈和队列被称为受限的线性表)。对于栈来说,其限制是仅允许在表的一端进行插入和删除运算,这一端被称为栈顶;相对地,把另一端称为栈底;向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
栈的几个基本操作包括,初始化、入栈、出栈、取栈顶元素、求长度、清空栈、判断是否为空。

栈分顺序栈和链式栈,下面程序介绍了顺序栈的实现

#ifndef GUARD_SEQSTACK_h
#define GUARD_SEQSTACK_h
#include<iostream>
using namespace std;
template<class T>
class SeqStack{
    template<class T>
    friend ostream& operator<<(ostream& os,SeqStack<T>& s);
private:
    T* elems;
    int top;
    int maxSize;
public:
    SeqStack(int Size=20);
    virtual~SeqStack();
    int Length()const;
    bool IsEmpty()const;
    bool Push(const T& e);//入栈
    bool Pop(T& e);//出栈
    bool Top(T& e)const;//取栈顶元素
    void Clear();//清空栈
    SeqStack(const SeqStack<T>& s);//复制构造函数
    SeqStack<T>& operator=(const SeqStack<T>& s);//赋值重载语句
};

template<class T>
SeqStack<T>::SeqStack(int Size){
    top=-1;
    maxSize=Size;
    elems=new T[maxSize];
}

template<class T>
SeqStack<T>::~SeqStack(){
    delete []elems;
}

//入栈,栈满的情况是top为maxSize,因为栈空的情况是top=-1;
template<class T>
bool SeqStack<T>::Push(const T& e){
    if(top==maxSize-1){
        return false;
    }
    else{
        elems[++top]=e;
        return true;
    }
}

//出栈,用e返回栈顶元素
template<class T>
bool SeqStack<T>::Pop(T& e){
    if(IsEmpty()){
        return false;
    }
    else
        e=elems[top--];
    return true;
}

//取栈顶元素,并没有将其弹出栈来
template<class T>
bool SeqStack<T>::Top(T& e)const{
    if(IsEmpty()){
        return false;
    }
    else{
        e=elems[top];
        return true;
    }
}

template<class T>
bool SeqStack<T>::IsEmpty()const{
    if(top==-1)
        return true;
    else
    return false;
}

//返回栈里面元素个数,因为栈空的时候top=-1,一个元素时,top=0;所以为top+1
template<class T>
int SeqStack<T>::Length()const{
    return top+1;
}

template<class T>
SeqStack<T>::SeqStack(const SeqStack<T>& s){
    maxSize=s.maxSize;
    top=s.top;
    elems=new T[maxSize];
    for(int i=0;i<maxSize;i++)
        elems[i]=s.elems[i];
}

template<class T>
void SeqStack<T>::Clear(){
    delete []elems;
    top=-1;
}

template<class T>
SeqStack<T>& SeqStack<T>::operator=(const SeqStack<T>& s){
    maxSize=s.maxSize;
    top=s.top;
    delete []elems;
    elems=new T[maxSize];
    for(int i=0;i<maxSize;i++)
        elems[i]=s.elems[i];
    return *this;

}

template<class T>
ostream& operator<<(ostream& os,SeqStack<T>& s){
    for(int i=0;i<=s.top;i++)
        os<<s.elems[i]<<" ";
    return os;
}
#endif

#include"SeqStack.h"
#include<iostream>
using namespace std;

int main(){
    char p;
    SeqStack<char> charstack(7);
    int i=0;

    while(charstack.Push('A'+i)){
        i=i+2;
    }
    cout<<charstack<<endl;

    while(charstack.Pop(p)){
        cout<<p<<" ";
    };

    cout<<endl;
    cout<<charstack.Length()<<endl;


    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值