2024王道408数据结构 P67 T5
思考过程
- 首先明白题目的意思,有两个栈,两个栈有共同的内存,写出两个栈入栈和出栈的操作,我们给两个栈区分开一个叫0号栈一个叫1号栈。
- 执行之前我们要判断要改变的栈是不是0号或1号栈,如果不是我们要返回。
if(i != 0 && i != 1) return 0;
- 其次当我们进行入栈是我们要判断要操作的栈是否栈满,满了就不能再入栈了,所以就要返回值。那么怎么判定这个栈是否栈满呢,0号栈入栈是从上面入栈,1号栈入栈是从下面入栈,我们给定两个top指针,假设此时栈满,那
s.top[1]-s.top[0]=1
此时就能说明栈满。
- 判断完是否栈满后,如果栈没满我们就开始入栈,将data数组赋值就行,只需要把
s.data[++s.top[0]]=x;
就完成了对0号栈的入栈,先往上移移动top指针再进行赋值,所以++在前面。1号栈的入栈操作也同理,但是1号栈是朝下的,所以移动top指针时要往下移s.data[--s.top[1]]=x;
入栈的过程就是这样。 - 对于出栈时也要判断此时栈是否栈空,如果栈空就返回值,那怎么判断两个栈的栈空呢,0号栈的栈空就是当top指针指向-1时就说明这个栈栈空,不能进行出栈操作。而1号栈也同理,题目已经告诉我们存储区的范围,所以当1号栈的top指针指向maxsize的时候就说明1号栈栈空,不能进行出栈操作。
- 0号栈出栈时要先把值带出再把指针往下移动,
return s.data[s.top[0]--]
所以减减在后面。1号栈也一样,这里是先把值带出再把指针往上移动,return s.data[s.top[1]++
。
这样两个栈的入栈出栈操作就完成了,完整代码如下
//
// Created by 黎圣 on 2023/7/30.
//
#include "iostream"
//50是我举的例子
#define MAX 50
struct stack
{
int data[MAX];
int top[2];
};
struct stack s;
//i是选择0号栈还是1号栈,x是入栈的元素
int push(int i, int x)
{
if (i != 0 && i != 1)
{
printf("无栈\n");
return 0;
}
if (s.top[1] - s.top[0] == 1)
{
printf("栈满\n");
return 0;
}
if (i == 0)
{
s.data[++s.top[0]] = x;
return 1;
}
if (i == 1)
{
s.data[--s.top[1]] = x;
return 1;
}
}
//i是选择0号栈还是1号栈
int pop(int i)
{
if (i != 0 && i != 1)
{
printf("无栈\n");
return 0;
}
if (i == 0)
{
if (s.top[0] == -1)
{
printf("0号栈栈空\n");
return 0;
}
return s.data[s.top[0]--];
}
else
{
if (s.top[1] == MAX)
{
printf("1号栈栈空\n");
return 0;
}
return s.data[s.top[1]++];
}
}
int main()
{
s.top[0] = -1;
s.top[1] = MAX;
// if (push(0, 1) != 0)
// printf("0号栈入栈成功\n");
// int x = pop(0);
// if (x != 0)
// printf("0号栈出栈成功,出栈元素为%d\n", x);
// int y = pop(0);
if (push(1, 1) != 0)
printf("1号栈入栈成功\n");
int x = pop(1);
if (x != 0)
printf("1号栈出栈成功,出栈元素为%d\n", x);
int y = pop(1);
return 0;
}
最后感谢b站up主@吸血小金鱼