双栈结构
要求
要求编写双栈初始化,判断栈空、栈满、进栈和出栈
已知的双栈结构:
typedef struct
{
int top[2], bot[2]; //栈顶和栈底指针
SElemType *V; //栈数组
int m; //栈最大可容纳元素
} DblStack;
算法思想
- 两栈共享向量空间,把栈的栈底设置在左右两端,初始时,左栈的栈底等于栈顶等于-1;右栈的栈底等于栈顶等于m;
- 两栈的栈顶相邻时栈满(右栈顶-左栈顶 = 1)
- 两栈顶相向增长,栈顶指针指向栈顶元素。
- 左栈执行进栈操作时候,栈顶元素(右移)+1;出栈时栈顶元素(左移)-1;
- 右栈执行进栈操作时候,栈顶元素(左移)-1;出栈时栈顶元素(右移)+1;
算法实现
- 初始化双栈
Status InitStack(DblStack &S, int m){ S.V = new SElemType[m];//初始化数组空间 if(!S.V) return Error; S.bot[0] = -1;//左栈的栈底指针 S.top[0] = -1;//左栈的栈顶指针 S.bot[1] = m;//右栈的栈底指针 S.top[1] = m;//右栈的栈顶指针 return OK; }
- 判断栈空
int IsEmpty(DblStack S){ return S.top[i] == S.bot[i]; }
- 判断栈满
int IsFull(DblStack S) { if (S.top[1] - top[0] == 1) return 1; else return 0; }
- 指定栈插入元素
Status DblPush(DblStack S, int i, SElemType x) { //判断栈满 if (S.top[1] - top[0] == 1) return ERROR; if (i == 0) S.V[++S.top[0]] = x; else S.V[--S.top[1]] = x; return OK; }
- 指定栈删除元素
Status DblPop(DblStack &S, int i, SElemType &x) { //判断栈空 if (S.top[i] == S.bot[i]) return ERROR; if (i == 0) x = S.V[S.top[0]--]; else x = S.V[S.top[1]++]; return OK; }