1.问题描述
- 将编号为0和1的两个栈存放于一个数组空间V[m]中,栈底分别处于数组的两端。当第0号栈的栈顶指针top[0]等于-1时该栈为空,当第1号栈的栈顶指针top[1]等于m时该栈为空。两个栈均从两端向中间增长。试编写双栈初始化,判断栈空、栈满、进栈和出栈等算法的函数。双栈数据结构的定义如下:
Typedef struct
{
int top[2],bot[2]; //栈顶和栈底指针
SElemType *V; //栈数组
int m; //栈最大可容纳元素个数
}DblStack
题目分析
- 两栈共享向量空间,将两栈栈底设在向量两端,初始时,左栈顶指针为-1,右栈顶为m。两栈顶指针相邻时为栈满。两栈顶相向、迎面增长,栈顶指针指向栈顶元素(不是只指向栈顶元素上一个位置,区别于顺序栈)。
代码实现
- main.cpp
/*
两个栈的编号分别为0和1,按照输入的栈号不同,操作
不同的栈。假设数组左侧的栈编号为0;右端的栈编号为1.
*/
#include <iostream>
using namespace std;
// 定义双栈结构
typedef struct
{
int top[2], bot[2]; // 栈顶指针和栈底指针
int *V; // 存储双栈的数组空间
int m; // 数组空间的大小
}DblStack;
//初始化:初始化一个大小为m的双栈
int InitStack(DblStack &S, int m)
{
S.V = new int[m];
if (!S.V)
{
return 0;//存储空间分配失败
}
S.top[0] = S.bot[0] = -1;
S.top[1] = S.bot[1] = m;
return 1;
}
/*
判断i号栈是否为空
*/
int IsEmpty(DblStack &S, int i)
{
return S.top[i] == S.bot[i];
}
// 判断栈是否满
int IsFull(DblStack &S)
{
if (S.top[1] - S.top[0] == 1)
{
return 1; // 栈满
}
else
{
return 0; // 栈空
}
}
// i号栈进栈操作
int Push(DblStack &S, int i, int e)
{
//将元素e进入i号栈
if (IsFull(S))
{
return 0;//栈已满,无法入栈
}
if (i == 0)
{
S.V[++S.top[0]] = e;
}
else
{
S.V[--S.top[1]] = e;
}
}
// i号栈出栈操作
int Pop(DblStack &S, int i, int &e)
{
//用返回i号栈的栈顶元素
if (IsEmpty(S, i))
{
return 0;//栈 空,无法出栈
}
if (i == 0)
{
e = S.V[S.top[0]--];
}
else
{
e = S.V[S.top[1]++];
}
return 1;
}
int main()
{
DblStack S;
int m;
printf("请输入栈空间的大小:");
scanf("%d", &m);
if (InitStack(S, m))
{
printf("双栈S初始化成功!\n");
}
else
{
printf("双栈S初始化失败!\n");
}
int x;
printf("输入要操作的栈的栈号:");
scanf("%d", &x);
if (IsEmpty(S, x))
{
printf("当前栈为空!\n");
}
else
{
printf("当前栈非空!\n");
}
if (IsFull(S))
{
printf("当前栈满!\n");
}
else
{
printf("当前栈未满!\n");
}
int n;
printf("请输入入栈的元素个数:");
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
int e;
printf("请输入第%d个元素:", i + 1);
scanf("%d", &e);
Push(S, x, e);
}
int s;
Pop(S, x, s);
printf("栈顶元素出栈:%d\n", s);
system("pause");
return 0;
}
- 运行结果