栈
栈示意图:
定义
只能在表的一端(栈顶)进行插入和删除运算的线性表
逻辑结构
一对一关系
存储结构
用顺序栈或链栈存储均可,但顺序栈更常见
运算规则
只能在栈顶运算,但访问结点时依照==后进先出(LIFO)或先进后出(FILO)==的原则
实现方式
关键是编写入栈和出栈函数,具体实现依顺序栈或链栈的不同而不同
基本操作有入栈、出栈、读栈顶元素值、建栈、判断栈满、栈空等
栈的表示和操作的实现
“进” =压入=PUSH()
“出” =弹出=POP( )
顺序栈的表示
#define MAXSIZE 100
typedef struct
{
SElemType \*base;
SElemType \*top;
int stacksize;
}SqStack;
顺序栈初始化
Status InitStack( SqStack &S )
{
S.base =new SElemType\[MAXSIZE\];
if( !S.base ) return OVERFLOW;
S.top = S.base;
S.stackSize = MAXSIZE;
return OK;
}
判断栈是否为空
bool StackEmpty( SqStack S )
{
if(S.top == S.base) return true;
else return false;
}
求顺序栈的长度
int StackLength( SqStack S )
{
return S.top – S.base;
}
清空顺序栈
Status ClearStack( SqStack S )
{
if( S.base ) S.top = S.base;
return OK;
}
销毁顺序栈
Status DestroyStack( SqStack &S )
{
if( S.base )
{
delete S.base ;
S.stacksize = 0;
S.base = S.top = NULL;
}
return OK;
}
顺序栈进栈
步骤:
(1)判断是否栈满,若满则出错
(2)元素e压入栈顶
(3)栈顶指针加1
代码:
Status Push( SqStack &S, SElemType e)
{
if( S.top - S.base== S.stacksize ) // 栈满
return ERROR;
*S.top++=e;
return OK;
}
顺序栈出栈
步骤:
(1)判断是否栈空,若空则出错
(2)获取栈顶元素e
(3)栈顶指针减1
代码:
Status Pop( SqStack &S, SElemType &e)
{
if( S.top == S.base ) // 栈空
return ERROR;
e= *--S.top;
return OK;
}