来源mooc西北大学视频教程
一 建栈操作
#define SMax 10
typedef struct Stack{
int Data[SMax];
int Top[2];
}Stack,*PStack;
Data栈存储数据域,SMax是共享栈的大小,Top[0]是底栈栈顶指示表示,Top[1]是顶栈栈顶指示标志。(就当做指针说好理解表达)
二 初始化栈。
void StackInit(PStack stack)
{
stack->Top[0] = -1;
stack->Top[1] = SMax;
}
三 进栈操作
bool StackPush(PStack stack, int i,int x)
{
if (stack->Top[0] + 1 == stack->Top[1])
return false;
switch (i)
{
case 0:stack->Top[0]++; stack->Data[stack->Top[0]] = x; break;
case 1:stack->Top[1]--; stack->Data[stack->Top[1]] = x; break;
default:
return false;
}
return true;
}
首先判栈是否满栈 满栈条件就是 底栈栈顶指针 是否与 顶栈栈顶指针相邻
四 出栈操作 先判断是哪个栈要出 是底栈还是顶栈 如果先判断栈是否是空的话 麻烦一点 考虑底栈跟顶栈其中一个不空,另外一个空的情况
bool StackPop(PStack stack, int i, int &x)
{
switch (i)
{
case 0:
if (stack->Top[0] == -1)
return false;
x = stack->Data[stack->Top[0]];
stack->Top[0]--;
break;
case 1:
if (stack->Top[1] == SMax)
return false;
x = stack->Data[stack->Top[1]];
stack->Top[1]++;
break;
default:
return false;
}
return true;
}
五 取栈顶操作 同出栈操作相似 除去栈顶指针移动语句即可
bool StackPopTop(PStack stack, int i, int &x)
{
switch (i)
{
case 0:
if (stack->Top[0] == -1)
return false;
x = stack->Data[stack->Top[0]];
break;
case 1:
if (stack->Top[1] == SMax)
return false;
x = stack->Data[stack->Top[1]];
break;
default:
return false;
}
return true;
}
整理代码如下
#define SMax 10
typedef struct Stack
{
int Data[SMax];
int Top[2];
}Stack,*PStack;
void StackInit(PStack stack)//初始化栈
{
stack->Top[0] = -1;
stack->Top[1] = SMax;
}
bool StackPush(PStack stack, int i,int x)
{
if (stack->Top[0] + 1 == stack->Top[1])//判栈满操作
return false;
switch (i)
{
case 0:stack->Top[0]++; stack->Data[stack->Top[0]] = x; break;
case 1:stack->Top[1]--; stack->Data[stack->Top[1]] = x; break;
default:
return false;
}
return true;
}
bool StackPop(PStack stack, int i, int &x)
{
switch (i)
{
case 0:
if (stack->Top[0] == -1)
return false;
x = stack->Data[stack->Top[0]];
stack->Top[0]--;
break;
case 1:
if (stack->Top[1] == SMax)
return false;
x = stack->Data[stack->Top[1]];
stack->Top[1]++;
break;
default:
return false;
}
return true;
}
bool StackPopTop(PStack stack, int i, int &x)
{
switch (i)
{
case 0:
if (stack->Top[0] == -1)
return false;
x = stack->Data[stack->Top[0]];
break;
case 1:
if (stack->Top[1] == SMax)
return false;
x = stack->Data[stack->Top[1]];
break;
default:
return false;
}
return true;
}