2024王道408数据结构 P67 T5

2024王道408数据结构 P67 T5

思考过程

  1. 首先明白题目的意思,有两个栈,两个栈有共同的内存,写出两个栈入栈和出栈的操作,我们给两个栈区分开一个叫0号栈一个叫1号栈。请添加图片描述
  2. 执行之前我们要判断要改变的栈是不是0号或1号栈,如果不是我们要返回。if(i != 0 && i != 1) return 0;
  3. 其次当我们进行入栈是我们要判断要操作的栈是否栈满,满了就不能再入栈了,所以就要返回值。那么怎么判定这个栈是否栈满呢,0号栈入栈是从上面入栈,1号栈入栈是从下面入栈,我们给定两个top指针,假设此时栈满,那s.top[1]-s.top[0]=1请添加图片描述此时就能说明栈满。
  4. 判断完是否栈满后,如果栈没满我们就开始入栈,将data数组赋值就行,只需要把s.data[++s.top[0]]=x;就完成了对0号栈的入栈,先往上移移动top指针再进行赋值,所以++在前面。1号栈的入栈操作也同理,但是1号栈是朝下的,所以移动top指针时要往下移s.data[--s.top[1]]=x;入栈的过程就是这样。
  5. 对于出栈时也要判断此时栈是否栈空,如果栈空就返回值,那怎么判断两个栈的栈空呢,0号栈的栈空就是当top指针指向-1时就说明这个栈栈空,不能进行出栈操作。而1号栈也同理,题目已经告诉我们存储区的范围,所以当1号栈的top指针指向maxsize的时候就说明1号栈栈空,不能进行出栈操作。请添加图片描述
  6. 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主@吸血小金鱼

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值