栈
1.栈的概念
栈是一种特殊的线性表,只能在一端进行插入和删除。简称LIFO
2.栈的应用举例
- 数值转换
- 表达式求值
- 括号匹配的检验
- 递归调用的实现
- 八皇后问题
- 函数调用
- 递归调用的实现
- 迷宫求解
3.顺序栈栈表示和操作的实现
由于栈本身就是线性表,于是栈也有顺序存储和链式存储两种实现方式
采用顺序存储对的栈称为顺序栈,它利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针(top)指示真正栈顶元素之上的下表地址。
typedef struct {
SElemType *base;
SElemType *top;
int stacksize;//栈可用的最大容量
}SqStack;
3.1初始化栈
Status InitStack(SqStack &S)
{
//构造一个空栈
S.base=new SElemType[MAXSIZE]; //为顺序栈分配一个最大容量为MAXSIZE的数组空间
if(!S.base) exit(OVERFLOW);//存储分配失败
S.top=S.base;//top初始为base,空栈
S.stacksize=MAXSIZE;//stacksize 置为栈的最大容量MAXSIZE
return OK;
}
3.2判断顺序栈是否为空
Status StackEmpty(SqStack S)
{
if(S.top=S.base)
return 1;
else
return 0;
}
3.3求顺序栈的长度
Status GetStackLength(SqStack S)
{
return S.top-S.base;
}
3.4清空顺序栈
Status ClearStack(SqStack &S)
{
if(S.base)
S.top=S.base;
return OK;
}
3.5销毁顺序栈
Status DestoryStack(SqStack &S)
{
if(S.base){
delete S.base;
S.stacksize=0;
S.base=S.top=NULL;
}
return OK;
}
3.6顺序栈入栈
Status Push(SqStack &S,SElemType e)
{
if(S.top-S.base==S.stacksize) return ERROR;//判断是否栈满,若满则出错(上溢)
*S.top==e;//元素e压入栈顶
S.top++;//栈顶指针加1
return OK;
}
3.7顺序栈出栈
Status Pop(SqStack &S,SElemType &e)
{
if(S.base==S.top) return ERROR;//判断是否栈空,若空则出错(下溢)
--S.top;//栈顶指针减1
e=*S.top;//e=*--S.top;将栈顶元素赋给e
return OK;
}
3.7读取栈顶元素
当栈非空时此操作返回当前栈顶元素的值,栈顶指针保持不变
SElemType GetTop(SqStack S)
{
if(S.top!=S.base) //栈非空
{
return *(S.top-1);//返回栈顶元素的值,栈顶指针不变
}
}
4.链栈表示和操作的实现
采用链式存储的栈称为链栈。通常链栈用单链表来表示。即链栈是运算受限的单链表,只能在链表头部进行。
4.1链栈的存储结构
typedef struct StackNode{
SElemType data;
struct StackNode *next;
}StackNode,*LinkStack;
4.2链栈的初始化
Status InitStack(LinkStack &S)
{
S=NULL;//栈顶指针置空
return OK;
}
4.3判断链栈是否为空
Status StackEmpty(LinkStack S)
{
if(S==NULL) return true;
else return false;
}
4.4链栈的入栈
Status Push(LinkStack &S,SElemType e)
{
StackNode *p=(LinkStack)malloc(sizeof(StackNode));//生成新结点P
p->data=e;//给新结点赋值
p->next=S;//让新结点插入栈顶
S=p;//修改栈顶指针
}
4.5链栈的出栈
Status Pop(LinkStack &S,SElemType &e)
{
StackNode *p=(LinkStack)malloc(sizeof(StackNode));
if(S==NULL) return ERROR; //栈空
e=S->data;//将栈顶元素值赋给e
p=S; //用p临时保存栈顶元素空间,以备释放
S=S->next;//修改栈顶指针
free(p);//释放原栈顶元素空间
return OK;
}
4.6链栈的取栈顶元素
SElemType GetElem(LinkStack S)
{
if(S!=NULL)//栈非空
{
return S->data;//返回栈顶元素的值,栈顶指针不变
}
}