浙大数据结构:02-线性结构4 Pop Sequence

这道题我们采用数组来模拟堆栈和队列。
简单说一下大致思路,我们用栈来存1234.....,队列来存输入的一组数据,栈与队列进行匹配,相同就pop
机翻

1、条件准备

stk是栈,que是队列。
tt指向的是栈中下标,front指向队头,rear指向队尾。
初始化栈顶为0,队头为0,队尾为-1
cpp 复制代码
#include<iostream>
using namespace std;

#define MAXSIZE 1010
#define ERROR -1

int stk[MAXSIZE],tt=0;
int que[MAXSIZE],front=0,rear=-1;
主函数加快cin,cout,将解决问题的步骤用solve()来实现
cpp 复制代码
int main()
{
  ios::sync_with_stdio(false);
  cin.tie(0);cout.tie(0);
  solve();
    return 0;
}

2、solve函数

先输入栈的最大空间,每组数据个数,有多少组。
将具体解决方法放入judge函数写,该函数会判断并输出yes,no
到下一组前要清空栈和队列。
cpp 复制代码
void  solve()
{
    int stksize,squsize,num;
    cin>>stksize>>squsize>>num;
   
    while(num--)
    { 
      judge(stksize,squsize);
//传栈最大空间,每组数据长度
      tt=0;front=0,rear=-1;
    }
  
}

3、judge函数

flag是判断最后该输出yes还是no
从1到squsize遍历,因为栈是按这个顺序放元素的,每次遍历入栈,并读一个数据到队列。
如果栈空间超过stksize了,则输出NO
如果队头元素与栈顶元素匹配,则pop
遍历完后看看队列还有没有没匹配的,有的话与栈中元素匹配,这时栈顶必须与队头匹配,不匹配则为NO
cpp 复制代码
void judge(int stksize, int squsize)
{
    int flag = 1;//标记是yes还是no
    for (int i = 1; i <= squsize; i++)
    { 
        stk[++tt] = i;   //放入栈中
        cin >> que[++rear];   //读取数据
        if (tt > stksize)   //栈空间超出限制
         flag = 0;
        while (tt && stk[tt] == que[front])
        {   //栈顶与队头元素匹配,pop
            tt--;
            front++;
        }
    }
    while (front <= rear)
    {  //最后剩余栈中的元素进行匹配
        if (stk[tt] != que[front])   flag = 0;
        tt--, front++;
    }
    if (flag)  //输出
        cout << "YES" << endl;
    else
        cout << "NO" << endl;
}

4、总结

用数组模拟栈队列在写算法题中也是常用的,因为结构体没数组这样找快。
当然这道题也可以写成栈与队列结构体的形式,只需把其中某些代码改动即可。
完整代码如下:
cpp 复制代码
#include <iostream>
using namespace std;

#define MAXSIZE 1010
#define ERROR -1

int stk[MAXSIZE], tt = 0;
int que[MAXSIZE], front = 0, rear = -1;

void judge(int stksize, int squsize)
{
    int flag = 1;
    for (int i = 1; i <= squsize; i++)
    {
        stk[++tt] = i;
        cin >> que[++rear];
        if (tt > stksize)
         flag = 0;
        while (tt && stk[tt] == que[front])
        {
            tt--;
            front++;
        }
    }
    while (front <= rear)
    {
        if (stk[tt] != que[front])   flag = 0;
        tt--, front++;
    }
    if (flag)
        cout << "YES" << endl;
    else
        cout << "NO" << endl;
}

void solve()
{
    int stksize, squsize, num;
    cin >> stksize >> squsize >> num;

    while (num--)
    {
        judge(stksize, squsize);
        tt = 0;
        front = 0, rear = -1;
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    solve();
    return 0;
}
相关推荐
武子康6 小时前
Qwen-Drive 到底是什么:4B 级 VLM 如何成为驾驶策略底座
人工智能·算法·机器学习
zh_xuan8 小时前
LeeCode 496. 下一个更大元素I
数据结构·算法·栈·单调栈
机 _ 长8 小时前
05 智算运维|8 张卡怎么才算「捆成一张」:NCCL 实测与拓扑
运维·人工智能·算法·智算运维
早起CaiCai9 小时前
【2023-01 OM】利用深度学习算法融合异质观测实现海洋场降尺度
人工智能·深度学习·算法
梦里寻码9 小时前
我用 NestJS + Vue3 写了一套完整的研发管理系统(58 表 / 229 API / 130 项断言,全开源
前端·后端·算法
猿人谷9 小时前
Surrogate Model:让进化算法学会“预测”,为什么它正在成为智能优化的重要技术?
后端·算法·架构
青少儿编程课堂11 小时前
蓝桥杯青少组图形化 STEMA 省考(报名倒计时·11/22开考)+ 全国青少年信息素养大赛 2026—2027赛季 + 电子学会图形化考级:校园华容道大闯关
c++·python·算法·bfs·信息学竞赛
白杨尚青11 小时前
C++进阶篇(五):红黑树——四条规则、三种插入情况与旋转变色
开发语言·数据结构·c++·stl·红黑树·平衡二叉树
在猴站学算法12 小时前
(《统计学习方法》(第2版) 李航)第2章 感知机算法
学习·算法·机器学习·统计学习