栈是限定仅在表的一端进行插入和删除操作的线性表,允许插入和删除的一端称为栈顶,另一端称为栈底,不含数据元素的栈称为空栈。
栈的特性:任何时刻出栈的元素都只能是栈顶元素,即最后入栈的最先出栈,具有后进先出的特性。
栈的顺序存储
顺序栈初始化:将栈顶指针top置为-1;
顺序栈的销毁:顺序栈是静态存储分配,自动释放存储单元,因此析构函数为空,无需销毁。
顺序栈的入栈:栈顶指针top加1,然后在top位置填入元素。模板代码如下:
template<typename T>
void SeqStack<T>::Push(T x){
if(top==Maxsize-1) throw"上溢";
data[++top]=x;
}//top为栈顶指针,data[]为存储元素的一维数组。
顺序栈的出栈:取出栈顶元素,然后栈顶top减1。
template<typename T>
T SeqStack<T>::Pop(){
if(top==-1) throw"下溢";
x=data[top--];
return x;
}//top为栈顶指针,data[]为存储元素的一维数组。
栈的链式存储
链栈结构体
//链栈的存储结构
typedef struct stacknode
{
int data;
struct stacknode *next;
}Stacknode;
//指向栈的指针
typedef struct
{
Stacknode *top;
}linkStack;
链栈的初始化:将栈顶指针top置空。
链栈的销毁:设置工作指针依次访问每一个结点并删除。
链栈的入栈:申请一个新结点,存入数据元素,然后将新结点插在栈顶。
template<typename T>
void SeqStack<T>::Push(T x){
Node *s=NULL;
s=new Node<T>;
s->data=x;
s->next=top;
top=s;
}
链栈的出栈:暂存栈顶结点元素,删除栈顶结点。
template<typename T>
T SeqStack<T>::Pop(T x){
Node *p;
if(top==NULL) throw"下溢";
x=top->data;
p=top;
top=top->next;
delete p;
return x;
}
以上就是栈中的常用操作,栈可以看为特殊的链表,相应操作可对比链表进行理解。