题目
将编号为 0 和 1 的两个栈存放于一个数组空间 V[m]中,栈底分别处于数组的两端。当第0 号栈的栈顶指针 top[0]等于-1 时该栈为空;当第 1 号栈的栈顶指针 top[1]等于 m 时,该栈为空。两个栈均从两端向中间增长(见下图)。试编写双栈初始化,判断栈空、栈满、进栈
和出栈等算法的函数。双栈数据结构的定义如下:
代码
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
typedef int SElemType;
//双栈数据结构定义
typedef struct
{
int top[2], bot[2]; //定义栈顶和栈底指针
SElemType* V; //栈数组
int m; //栈最大可容纳元素个数
}DblStack;
//初始化双栈
void InitDblStack(DblStack& stack, int Maxsize)
{
SElemType* arr = (SElemType*)malloc(sizeof(SElemType));//申请空间
stack.V = arr; //将V指针指向申请的空间
stack.m = Maxsize; //初始化最大元素个数
stack.top[0] = -1; //左栈栈顶指针初始化
stack.bot[0] = 0; //左栈栈底指针初始化
stack.top[1] = stack.m; //右栈栈顶指针初始化
stack.bot[1] = stack.m - 1; //右栈栈底指针初始化
}
//判断栈空(若为空栈,返回1)
int EmptyDblStack(DblStack stack)
{
if (stack.top[0] == -1 && stack.top[1] == stack.m)
return 1;
return 0;
}
//判断是否为满栈(满栈返回1)
int FullDblStack(DblStack stack)
{
if (stack.top[1] == ( stack.top[0] + 1 ) )
return 1;
return 0;
}
//左栈进栈
int pushLeft(DblStack& stack, SElemType item)
{
if (FullDblStack(stack) == 1)//判断是否为满栈
{
printf("栈已满,无法进栈\n");
return 0; //满栈返回0
}
stack.top[0]++; //左栈栈顶指针加一
stack.V[stack.top[0]] = item; //将数据元素进栈
return 1; //完成操作返回1
}
//右栈进栈
int pushRight(DblStack& stack, SElemType item)
{
if (FullDblStack(stack) == 1) //栈已满
{
printf("栈已满,无法进栈\n");
return 0;
}
stack.top[1]--; //右栈栈顶指针减1
stack.V[stack.top[1]] = item; //将数据元素进栈
return 1;
}
//左栈出栈
SElemType popLeft(DblStack& stack)
{
if (stack.top[0] == -1) //栈为空
{
printf("左栈为空,无法出栈\n");
return 0;
}
SElemType item = stack.V[stack.top[0]]; //取出栈顶数据元素
stack.top[0]--; //调整左栈顶指针
return item; //返回原栈顶元素
}
//右栈出栈
SElemType popRight(DblStack& stack)
{
if (stack.top[1] == stack.m) //判断是否为空栈
{
printf("右栈已空,无法出栈\n");
return 0;
}
SElemType item = stack.V[stack.top[1]]; //取出右栈栈顶元素
stack.top[1]++; //调整又栈顶指针
return item; //返回原栈顶元素
}
//遍历双栈
void printDblStack(DblStack stack)
{
for (int i = 0; i <= stack.top[0]; i++) //输出左栈
printf("|%d| ", stack.V[i]);
for (int i = ++stack.top[1]; i < stack.m; i++)//输出右栈
printf("|%d| ", stack.V[i]);
printf("\n");
}
int main()
{
DblStack stack;
int Maxsize;
cout << "输入栈的容纳长度\n";
cin >> Maxsize;
InitDblStack(stack, Maxsize); //初始化双栈
if (EmptyDblStack(stack) == 1)
cout << "双栈为空\n";
pushLeft(stack, 1); //左栈进栈
pushLeft(stack, 2); //左栈进栈
pushRight(stack, 4); //右栈进栈
pushRight(stack, 5); //右栈进栈
cout << popLeft(stack) <<endl;
cout << popLeft(stack) <<endl;
cout << popRight(stack) <<endl;
cout << popRight(stack) <<endl;
return 0;
}