1.题目
将编号为0和1的两个栈存放于一个数组空间V[m]中,栈底分别处于数组的两端。当第0号栈的栈顶指针top[0]等于-1时该栈为空;当第1号栈的栈顶指针top[1]等于m时该栈为空。两个栈均从两端向中间增长(见图)。试编写双栈初始化,判断栈空、栈满、进栈和出栈等算法的函数。
2.代码展示(c语言)
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 6
typedef struct {
int top[2], bot[2];
int* array;
int size;
}Stack;
Stack sta;
void InitStack(Stack& S)//栈初始化
{
int*arr = (int*)malloc(sizeof(MAXSIZE));
S.array = arr;
S.size = MAXSIZE;
S.top[0] = -1;
S.bot[0] = 0;
S.top[1] = S.size - 1;
S.bot[1] = S.size - 1;
}
int StackEmpty(Stack stack)//判断双栈整体是否为空
{
if (stack.top[0] == -1 && stack.top[1] == stack.size - 1)
{
return 1;
}
return 0;
}
int FullStack(Stack stack)//判断栈满,三种情况:两边都满,或左栈满,右栈满
{
if (stack.top[0] == stack.top[1] ||stack.top[0]>stack.size || stack.top[1]<0)
{
return 1;
}
return 0;
}
int pushLeft(Stack& stack, int e)//左栈元素进栈
{
if (FullStack(stack) == 1)
{
printf("栈已满不能进行进栈操作\n");
return 0;
}
stack.top[0]++;
stack.array[stack.top[0]] = e;
return 1;
}
int pushRight(Stack& stack, int e)//右栈元素进栈
{
if (FullStack(stack) == 1)
{
printf("栈已满,无法进行进栈操作\n");
return 0;
}
stack.array[stack.top[1]] = e;
stack.top[1]--;
return 1;
}
void outsert(Stack S)//输出双栈
{
for (int i = 0; i <= S.top[0]; i++)
{
printf("|%d|", S.array[i]);
}
for (int j =++ S.top[1]; j < S.size; j++)
{
printf("|%d|", S.array[j]);
}
}
int main()
{
InitStack(sta);
printf("双栈%s空栈\n", StackEmpty(sta) == 1 ? "是" : "不是");
int a=1;
printf("1.元素进栈!\n");
printf("0.退出!\n");
while (a==1)//利用一个循环将元素压进栈
{
int n,k,e;
printf("请输入序号:");
scanf_s("%d", &n);
switch (n)
{
case 0:
{
printf("已退出");
a = 0;
break;
}
case 1:
{
printf("输入0进左栈,1进右栈:");
scanf_s("%d", &k);
printf("请输入进栈元素:");
scanf_s("%d", &e);
if (k == 0)
{
pushLeft(sta, e);
}
if (k == 1)
{
pushRight(sta, e);
}
break;
}
}
}
printf("双栈%s满栈\n", FullStack(sta) == 1 ? "已" : "未");
printf("双栈结果为:\n");
outsert(sta);
return 0;
}