栈(stack)是限定仅在表尾进行插入或删除操作的线性表,其最大的特点就是先进后出(LIFO)。
栈分为两种:顺序栈和链栈
顺序栈:指用顺序存储结构实现的栈
栈的结构
typedef struct{
int *base;//栈底指针
int *top;//栈顶指针
int stacksize;//栈的长度
}SqStack;
顺序栈的结构示意图
栈的初始化
Status InitStack(SqStack &S)
{
S.base=new int[MAX];//MAX是内存动态分配的长度
if(!S.base)
return ERROR;//栈分配失败
S.top=S.base;//一开始栈底指针和栈顶指针指向栈栈底
S.stacksize=MAX;
return OK;
}
入栈:将数据一个一个压入栈底
Status Push(SqStack &S,int e)
{
if(S.top-S.base==S.stacksize)
return ERROR;//栈已满
*S.top++=e;//先将数据赋予当前栈顶指针所指向的空间,然后指针移向下一位置
return OK;
}
出栈:将数据从栈顶一个一个的取出
Status Pop(SqStack &S,int &e)
{
if(S.top==S.base)//空栈
return ERROR;
e=*--S.top;//先将栈顶指针移向上一空间,然后将指针所指向空间的数据赋给e
return e;
链栈:指用链式存储结构实现的栈
链栈的结构
typedef struct StackNode
{
int data;//数据域
struct StackNode *next;//指针域
}StackNode,*LinkStack;
链栈示意图
栈的初始化
Status InitStack(LinkStack &S)
{
S=NULL;//构造一个空栈,置空
return OK;
}
入栈
Status Push(LinkStack &S,int e)
{
LinkStack p;
p=new StackNode;//构造一个新的结点
p->data=e;//将新结点的数据域置为e
p->next=S;//将新结点插入栈顶
S=p;//修改栈顶指针为p
return OK;
}
出栈
Status Pop(LinkStack &S,int &e)
{
LinkStack p;
if(S==NULL)
return ERROR;//空栈
e=S->data;//将数据赋给e
p=S;//临时保存栈顶元素空间
S=S->next;//修改栈顶指针
delete p;//释放原栈顶空间
return e;
}