产出
CSDN 技术博客 1 篇
哔哩哔哩专栏1篇
问题
将编号为 0 和 1 的两个栈存放于一个数组空间 V[m]中,栈底分别处于数组的两端。当第0 号栈的栈顶指针 top[0]等于-1 时该栈为空;当第 1 号栈的栈顶指针 top[1]等于 m 时,该栈为空。两个栈均从两端向中间增长(见下图)。试编写双栈初始化,判断栈空、栈满、进栈
和出栈等算法的函数。双栈数据结构的定义如下;
所需函数
1、初始化双栈
void InitDblStack(DblStack &stack)
2、判断总体是否为空栈
int EmptyDblStack(DblStack stack)
3、判断左栈是否为空栈
int EmptyLeft(DblStack stack)
4、判断右栈是否为空栈
int EmptyRight(DblStack stack)
5、判断是否为满栈
int FullDblStack(DblStack stack)
6、左栈进栈
int pushLeft(DblStack &stack, elem e)
7、右栈进栈
int pushRight(DblStack &stack, elem e)
8、左栈出栈
elem popLeft(DblStack &stack)
9、右栈出栈
elem popRight(DblStack &stack)
10、遍历双栈
void printDblStack(DblStack stack)
实现代码
#include <stdio.h>
#include <stdlib.h>
#define InitMaxsize 3//栈最大可容纳元素个数
typedef int elem;
typedef struct
{
int top[2], bot[2];//定义栈顶和栈底指针
elem *V; //栈数组
int m; //栈最大可容纳元素个数
}DblStack;
//初始化双栈
void InitDblStack(DblStack &stack)
{
elem *arr = (elem*)malloc(sizeof(elem));//申请空间
stack.V = arr; //将V指针指向申请的空间
stack.m = InitMaxsize; //初始化栈最大可容纳最大元素个数
stack.top[0] = -1; //左栈栈顶指针初始化
stack.top[1] = stack.m - 1; //右栈栈顶指针初始化
stack.bot[0] = 0; //左栈栈底指针初始化
stack.bot[1] = stack.m-1; //右栈栈底指针初始化
}
//判断总体是否为空栈
int EmptyDblStack(DblStack stack)
{
if(stack.top[0] == -1 && stack.top[1] == stack.m-1)
return 1; //若是返回1
return 0; //否则返回0
}
//判断左栈是否为空栈
int EmptyLeft(DblStack stack)
{
if(stack.top[0] == -1)
return 1; //若是返回1
return 0; //否则返回0
}
//判断右栈是否为空栈
int EmptyRight(DblStack stack)
{
if(stack.top[1] == stack.m-1)
return 1; //若是返回1
return 0; //否则返回0
}
//判断是否为满栈
int FullDblStack(DblStack stack)
{
if(stack.top[1] == stack.top[0] || stack.top[0] >= stack.m || stack.top[1] < 0 )
//三种满栈情况左右两栈中间相遇,左栈满,右栈满
return 1;//满栈返回1
return 0;//否则返回0
}
//左栈进栈
int pushLeft(DblStack &stack, elem e)
{
if (FullDblStack(stack) == 1)//判断是否为满栈
{
printf("栈已满不能进行进栈操作\n");
return 0; //满栈返回0
}
stack.top[0]++; //左栈栈顶指针加一
stack.V[stack.top[0]] = e; //将数据元素进栈
return 1; //完成操作返回1
}
//右栈进栈
int pushRight(DblStack &stack, elem e)
{
if (FullDblStack(stack) == 1)//判断是否为满栈
{
printf("栈已满,无法进行进栈操作\n");
return 0; //满栈返回0
}
stack.V[stack.top[1]] = e; //将数据元素进栈
stack.top[1]--; //右栈栈顶指针加一
return 1;
}
//左栈出栈
elem popLeft(DblStack &stack)
{
if (EmptyLeft(stack) == 1)//判断是否为空栈
{
printf("左栈已空,无法进行出栈操作\n");
return 0; //空栈返回0
}
elem e = stack.V[stack.top[0]]; //取出栈顶数据元素
stack.top[0]--; //左栈栈顶元素减一
return e; //返回原栈顶元素
}
//右栈出栈
elem popRight(DblStack &stack)
{
if (EmptyRight(stack) == 1) //判断是否为空栈
{
printf("右栈已空,无法进行出栈操作\n");
return 0; //空栈返回0
}
stack.top[1]++; //右栈栈顶指针加一
elem e = stack.V[stack.top[1]]; //取出右栈栈顶元素
return e; //返回原栈顶元素
}
//遍历双栈
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;
InitDblStack(stack); //初始化双栈
printf("双栈%s空栈\n", EmptyDblStack(stack) == 1?"是":"不是"); //判断总体是否为空栈
pushLeft(stack, 1); //左栈进栈
pushLeft(stack, 2); //左栈进栈
pushRight(stack, 3); //右栈进栈
printf("双栈%s满栈\n", FullDblStack(stack) == 1?"已":"未");//判断是否为满栈
popLeft(stack);
popRight(stack);
popRight(stack);
printDblStack(stack);
return 0;
}
运行结果
理解方法
1、根据题意想象出程序运行的动态图,如果想不出来可以尝试用笔画一下。
2、源代码注释很全,看代码不能急躁,慢慢看。一行一行代码分析。
如有错误,欢迎读者批评指正。
如有疑问,可在下方留言。