栈(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;
}