共享栈的原理及代码实现(C语言)
共享栈是一种特殊的栈,由顺序存储结构实现。
其特点在于两个栈共享同一块存储空间。
可以参考下面这张示意图(莫嫌丑)
两个栈的栈底分别位于数组的两端,而栈顶位于中间的位置(由元素数量决定),在上图中栈一有三个元素,栈底位于下标零处,栈顶位于下标二处;栈二有两个元素,栈底位于下标八处,栈顶位于下标七处。
当有元素入栈,栈顶的位置便向另一侧靠近,直至两栈顶下标只差有,此时栈满。
以下是共享栈的C语言实现代码
/*
共享空间的栈
即一个数组存储两个栈,一个栈的栈底在下标零处,另一个在下标最大处
此种结构不适用于两个栈空间增长都很快的情况
*/
#include <stdio.h>
#include <Windows.h>
#define maxNum 100
typedef struct
{//共享栈的结构
int data[maxNum];
int Top1 = -1;
int Top2 = maxNum;
}shared_stack;
typedef shared_stack* sharedStack;
//打印栈
void showStack(sharedStack S);
//入栈
void append(sharedStack S, int value, int whichStack);
//出栈
int pop(sharedStack S, int whichStack);
void showStack(sharedStack S)
{
printf("Top1: %d\n", S->Top1);
if (S->Top1 == -1)
{
printf("栈一为空栈\n");
}
else
{//不为空栈
printf("栈1:\n");
for (int i = 0; i <= S->Top1; i++)
{
printf("%d: %d\n", i, S->data[i]);
}
}
printf("\nTop2: %d\n", S->Top2);
if (S->Top2 == -1)
{
printf("栈二为空栈\n");
}
else
{//不为空栈
printf("\n栈2:\n");
for (int i = maxNum - 1; i >= S->Top2; i--)
{
printf("%d: %d\n", maxNum - i - 1, S->data[i]);
}
printf("\n\n");
}
}
void append(sharedStack S, int value, int whichStack)
{
if (S->Top2 == S->Top1)
{
printf("栈满\n");
return;
}
if (whichStack == 1)
{
S->data[S->Top1 + 1] = value;
S->Top1++;
}
else if (whichStack == 2)
{
S->data[S->Top2 - 1] = value;
S->Top2--;
}
}
int pop(sharedStack S, int whichStack)
{
if (whichStack == 1)
{
if (S->Top1 == -1)
{
printf("栈一为空栈!");
}
else
{
S->Top1--;
return S->data[S->Top1 + 1];
}
}
else if (whichStack == 2)
{
if (S->Top1 == maxNum)
{
printf("栈二为空栈!");
}
else
{
S->Top2++;
return S->data[S->Top2 - 1];
}
}
}
int main(void)
{
//初始化栈
sharedStack S = (sharedStack)malloc(sizeof(shared_stack));
for (int i = 0; i < 10; i++)
{
S->data[i] = i + 1;
}
S->Top1 = 9;
for (int i = maxNum-1; i >= 90; i--)
{
S->data[i] = i - 80;
}
S->Top2 = 90;
//打印栈
showStack(S);
//将元素7入栈一
append(S, 7, 1);
showStack(S);
//将栈二的元素出栈
int value = pop(S, 2);
printf("出栈元素:%d\n\n", value);
showStack(S);
system("PAUSE");
return 0;
}