【数据结构 | PTA】栈

news2024/12/25 8:52:15

文章目录

    • 7-1 汉诺塔的非递归实现
    • 7-2 出栈序列的合法性
    • **7-3 简单计算器**
    • 7-4 盲盒包装流水线

7-1 汉诺塔的非递归实现

借助堆栈以非递归(循环)方式求解汉诺塔的问题(n, a, b, c),即将N个盘子从起始柱(标记为“a”)通过借助柱(标记为“b”)移动到目标柱(标记为“c”),并保证每个移动符合汉诺塔问题的要求。

输入格式:
输入为一个正整数N,即起始柱上的盘数。

输出格式:
每个操作(移动)占一行,按柱1 -> 柱2的格式输出。

输入样例:

3

输出样例:

a -> c
a -> b
c -> b
a -> c
b -> a
b -> c
a -> c
#include"stdio.h"
#include"stdlib.h"
int main()
{
	int N;
	scanf("%d",&N);
	int zhu[4][N+1];
	zhu[3][0]=0;
	zhu[1][0]=0;
	zhu[2][0]=0;
	char biaohao[5]=" abc";
	//puts(biaohao); 
	for(int aa=N;aa>0;aa--)//给源柱子加上盘子 
	{
		zhu[1][0]+=1;
		zhu[0][zhu[1][0]]=1;//记录所有盘子都在第一行 
		zhu[1][zhu[1][0]]=aa;
		//printf("%d",zhu[1][zhu[1][0]]);
	}
	int sum=0;//左移还是右移
	if(N%2==0)
	sum=1;
	else
	sum=-1;
	int start=1;
	int next=start+sum;//将移动到的柱子号
	int dang=1;//当前所移动的盘子号 
	int flag=-1;//当前盘子是否移动成功,0为否,1为真 
	int Z=0;//需要的总步数 
	while(zhu[3][0]!=N)
	{
		flag=-1;
		if(next>3)
		next=1;
		if(next<1)
		next=3;
		if(zhu[next][0]==0||zhu[start][zhu[start][0]]<zhu[next][zhu[next][0]])
		{
			zhu[next][0]+=1;
			zhu[next][zhu[next][0]]=zhu[start][zhu[start][0]];
			//盘子向右移动 
			zhu[0][zhu[next][zhu[next][0]]]=next;
			//更新刚刚所移动的盘子所在的柱子号 
			zhu[start][0]-=1;
			printf("%c -> %c\n",biaohao[start],biaohao[next]);
			flag=1; 
		}
		if(flag==1||next==start)
		//前者为移动成功,后者为移动失败
		{
			dang+=1;
			if(dang==N+1)
			dang=1;
			while(dang!=zhu[zhu[0][dang]][zhu[zhu[0][dang]][0]])
			//当前所要移动的盘子不在其柱子的顶层时进入循环 
			{
				dang+=1;
				if(dang==N+1)
			    dang=1;
			}
			start=zhu[0][dang];//更新将移动的盘子所在的柱子号
			next=start+sum; 
			}
		else
		next+=sum;		        
		}
}

7-2 出栈序列的合法性

给定一个最大容量为 m 的堆栈,将 n 个数字按 1, 2, 3, …, n 的顺序入栈,允许按任何顺序出栈,则哪些数字序列是不可能得到的?例如给定 m=5、n=7,则我们有可能得到{ 1, 2, 3, 4, 5, 6, 7 },但不可能得到{ 3, 2, 1, 7, 5, 6, 4 }。

输入格式:
输入第一行给出 3 个不超过 1000 的正整数:m(堆栈最大容量)、n(入栈元素个数)、k(待检查的出栈序列个数)。最后 k 行,每行给出 n 个数字的出栈序列。所有同行数字以空格间隔。

输出格式:
对每一行出栈序列,如果其的确是有可能得到的合法序列,就在一行中输出YES,否则输出NO

输入样例:

5 7 5
1 2 3 4 5 6 7
3 2 1 7 5 6 4
7 6 5 4 3 2 1
5 6 4 3 7 2 1
1 7 6 5 4 3 2

输出样例:

YES
NO
NO
YES
NO
#include<stack>
#include<queue>
#include<iostream>
#include<cstdio>
using namespace std;
int main() {
	stack<int>s;
	int m, n, k,flag;
	int arr[1000];
	cin >> m >> n >> k;
	for (int i = 0; i < k; i++) {
		for (int j = 0; j < n; j++) {
			cin >> arr[j];
		}
		int flag = 0;
		while (!s.empty()) {
			s.pop();
		}
		for (int i = 1; i <= n; i++) {
			if (s.size() < m) {
				s.push(i);
			}
			if (s.size() == m && s.top() != arr[flag]) {
				break;
			}
			while (!s.empty() && s.top() == arr[flag]) {
				s.pop();
				flag++;
			}
		}
		if (flag == n) cout << "YES" << endl;
		else
			cout << "NO" << endl;
	}
}

7-3 简单计算器

本题要求你为初学数据结构的小伙伴设计一款简单的利用堆栈执行的计算器。如上图所示,计算器由两个堆栈组成,一个堆栈 S1 存放数字,另一个堆栈 S2 存放运算符。计算器的最下方有一个等号键,每次按下这个键,计算器就执行以下操作:

  1. 从 S1 中弹出两个数字,顺序为 n1 和 n2;
  2. 从 S2 中弹出一个运算符 op;
  3. 执行计算 n2 op n1;
  4. 将得到的结果压回 S1。

直到两个堆栈都为空时,计算结束,最后的结果将显示在屏幕上。

输入格式:
输入首先在第一行给出正整数 N(1<N≤103),为 S1 中数字的个数。
第二行给出 N 个绝对值不超过 100 的整数;第三行给出 N−1 个运算符 —— 这里仅考虑 +-*/ 这四种运算。一行中的数字和符号都以空格分隔。

输出格式:
将输入的数字和运算符按给定顺序分别压入堆栈 S1 和 S2,将执行计算的最后结果输出。注意所有的计算都只取结果的整数部分。题目保证计算的中间和最后结果的绝对值都不超过 109。

如果执行除法时出现分母为零的非法操作,则在一行中输出:ERROR: X/0,其中 X 是当时的分子。然后结束程序。

输入样例 1:

5
40 5 8 3 2
/ * - +

输出样例 1:

2

输入样例 2:

5
2 5 8 4 4
* / - +

输出样例 2:

ERROR: 5/0
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
stack<ll> s1;
stack<char> s2;
int main()
{
	ll n,a;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a;
		s1.push(a);
	}
	for(int i=1;i<n;i++)
	{
		char s;
		cin>>s;
		s2.push(s);
	}
	ll f=0,ff,num=0;
	for(int i=1;i<n;i++)
	{
		ll n1,n2,ans;
		char op;
		n1=s1.top();
		s1.pop();
		n2=s1.top();
		s1.pop();
		op=s2.top();
		s2.pop();
		if(op=='/'&&n1==0)
		{
			f=1;
			ff=n2;
			break;
		}
		if(op=='+') 
			ans=n2+n1;
		if(op=='-') 
			ans=n2-n1;
		if(op=='*') 
			ans=n2*n1;
		if(op=='/') 
			ans=n2/n1;
		num=ans;
		s1.push(ans);
	}
	if(f==1) cout<<"ERROR: "<<ff<<"/0"<<endl;
	else cout<<num<<endl;
	return 0;
 } 

7-4 盲盒包装流水线

众所周知,PAT 有 9 枚徽章,分别对应青铜、白银、黄金、白金、钻石、大师、王者、大圣、天神这 9 个段位,只有成绩非常优秀的考生才有资格获得刻有自己名字的徽章。现在,PAT 制作了徽章的小型纪念版,要制成盲盒给大家玩了!

下图是一条盲盒包装流水线的示意图。首先徽章通过进货口被压入货栈里,空盒在履带上从左向右传送。每次从货栈里弹出一枚徽章,进入打包机,装入一只空盒,打包后继续向右边传送。当货栈为空时,打包机会暂停,等待下一批徽章压入货栈。

lsx.png

每只盒子都有一个编号,小拼姐姐手里有进入流水线的空盒编号顺序表,也有每一批送往货栈的徽章顺序表,这样她其实可以知道每只盒子里装了哪种徽章。有些小朋友收到了盲盒,就想在拆封前问无所不知的小拼姐姐,盒子里的徽章是哪一种。但是因为盲盒总量有 105 这么多,小拼姐姐可记不住每只盒子里装的是什么,于是你就被请来写个程序帮小拼姐姐回复这种信息。

输入格式:

输入第一行给出 2 个正整数,分别为盲盒总量 N(≤105)和货栈容量 S(≤100)。接下来一行给出 N 只盒子的编号,编号由 5 位数字组成,给出的顺序是空盒进入传送带的顺序。随后 N/S(保证是整数)行,每行给出一批 S 枚徽章的类型,为 1-9 的数字,给出的顺序是从进货口入栈的顺序。

再下面给出一个正整数 K(≤104),为查询次数。随后 K 行,每行给出一个 5 位编号。

输出格式:

对每个查询编号,在一行中输出该盒子中装的徽章类型。如果编号是错误的,则在一行中输出 Wrong Number

输入样例:

10 5
00132 10093 92001 23333 66666 88888 09009 34658 82750 69251
1 2 3 4 5
9 8 7 6 1
5
66666
88888
69251
55555
10093

输出样例:

1
1
9
Wrong Number
4
#include <iostream>
#include <map>
#include <queue>
#include <stack>
using namespace std;
 
int main()
{
    map<int, int> res; //<盲盒编号,徽章类型>
    queue<int> emptybox; //空盒传送带
    queue<int> input; //徽章从进货口入栈的顺序
    stack<int> box; //货栈
 
    int n, s, temp; cin >> n >> s;
    for (int i = 0; i < n; i++) { //记录
        cin >> temp; emptybox.push(temp);
    }
    for (int i = 0; i < n; i++) {
        cin >> temp; input.push(temp);
    }
 
    while (!emptybox.empty()) { //打包
        for (int i = 0; i < s; i++) { //前s个徽章入栈
            box.push(input.front()); input.pop();
        }
        for (int i = 0; i < s; i++) {
            res.insert(make_pair(emptybox.front(), box.top()));
            emptybox.pop(); box.pop();
        }
    }
 
    int k; cin >> k;
    while (k--) { //判断
        cin >> temp;
        if (res.find(temp) != res.end())
            cout << res[temp] << endl;
        else
            cout << "Wrong Number" << endl;
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2197237.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分析和解决js运算精度问题,出现多位小数

加减乘除都会出现小数精度错误的问题 (见图) 原因&#xff1a;js进行运算时会将数字先转为二进制再进行运算。 错误思路&#xff1a;之前在做数字运算时都是将数字转化为整数再进行运算&#xff0c;某次突然发现在变整数的时候也会出现精度问题&#xff0c;比如上图中的数据。…

LINUX——内核移植、内核编译教程

Linux内核编译是一个将内核源代码转换成可在特定硬件架构上运行的二进制文件的过程。以下是编译Linux内核的一般步骤&#xff1a; 1、准备工作&#xff1a; 确保安装了必要的编译工具&#xff0c;如gcc、make、ncurses库&#xff08;用于make menuconfig&#xff09;等。 2、…

【读书笔记-《30天自制操作系统》-26】Day27

本篇内容不多&#xff0c;主要是一些优化的工作。首先优化了应用程序&#xff0c;然后引入对应用程序的保护功能&#xff0c;最后引入库的概念。 1. 应用程序优化 首先来解决上一篇中遗留的一个bug:使用ncst命令运行的应用程序&#xff0c;按下ShiftF1或者点击x按钮都无法关…

Hierarchical Cross-Modal Agent for Robotics Vision-and-Language Navigation

题目&#xff1a;用于视觉语言导航的层次化跨模态智能体 摘要 1. 问题背景和现有方法 VLN任务&#xff1a;这是一种复杂的任务&#xff0c;要求智能体基于视觉输入和自然语言指令进行导航。 现有方法的局限性&#xff1a;之前的工作大多将这个问题表示为离散的导航图&#x…

『网络游戏』登陆启动框架【05】

将上一章的加载界面隐藏 1.游戏启动逻辑 创建脚本GameRoot.cs &#xff08;该脚本为游戏入口&#xff0c;作用初始化游戏&#xff09; 创建脚本&#xff1a;ResSvc.cs &#xff08;&#xff09; 创建脚本&#xff1a;LoginSys.cs &#xff08;&#xff09; 编写脚本&a…

解析Vue源码中是如何进行模版编译的

模版编译 联系前文&#xff0c;讲了虚拟DOM的patch过程&#xff0c;而虚拟DOM的前提是先有VNode&#xff0c;那么VNode又是从哪里来的&#xff1f;接下来讲的模版编译便是&#xff1a;把用户写的模版进行编译&#xff0c;就会产生VNode。 在日常开发中&#xff0c;我们把写在…

Qt-目录和文件

1. 目录和文件 1.1 目录操作 QDir 类用来处理目录 常用方法&#xff1a; QDir(QString path) &#xff1a; 实例化 absolutePath() : 获取目录绝对路径 dirName() : 获取目录相对路径 exists(dirPath) : 判断目录是否存在 mkdir(QString dirPath) : 创建目录 rmdir(QStr…

经典5级流水线概述

抽象化的流水线结构&#xff1a; 流水线的基本概念 多个任务重叠&#xff08;并发/并行&#xff09;执行&#xff0c;但使用不同的资源流水线技术提高整个系统的吞吐率&#xff0c;不能缩短单个任务的执行时间其潜在的加速比&#xff1d;流水线的级数 流水线正常工作的基本条件…

使用YOLO11实例分割模型进行人物分割【附完整源码】

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

开放式蓝牙耳机哪个品牌好用?五大口碑最好开放式耳机力荐!

长时间佩戴传统入耳式耳机有时可能会影响耳道健康&#xff0c;鉴于此&#xff0c;转而选择不入耳设计的开放式耳机就成了不少人的新倾向&#xff0c;它们有助于减少细菌滋生和耳道闷热的烦恼。为了帮助大家找到合适的选项&#xff0c;下面我将列举一些市面上口碑不错的开放式耳…

跨境电商怎么搭建网络环境?

跨境电商搭建网络环境是一项复杂但至关重要的任务&#xff0c;它涉及到多个层面的技术和服务。以下是构建高效、安全、可扩展的跨境电商网络环境的一些建议&#xff1a; 1. 选择合适的云服务提供商 可靠性与稳定性&#xff1a;选择知名且有良好口碑的云服务提供商&#xff0c;确…

MySql复习知识及扩展内容

DDL操作库和表 -- todo ------------操作库---------------------------------- -- 创建库 create database if not exists day10 charset utf8; create database if not exists day11 char set gbk; -- 使用库 use day10; -- 查询库 show databases ; -- 删除库 drop databas…

mybatisplus整合springboot3出错(springboot多模块开发)

1.mybatisplus版本太低或者maven导入没用如下的 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.5</version></dependency>2.maven导入冲突了&#xf…

千万不要再用varchar类型来存ip地址了!

对于一个ip地址&#xff0c;比如“192.168.0.110”&#xff0c;由于存在“.”号&#xff0c;所以大部分人都会用varchar类型的字段来进行存储&#xff0c;但是大家有没有想过&#xff0c;对于这样一个字符串&#xff0c;每个字符占用一个字节&#xff0c;那么就需要占用13个字节…

使用ChatGPT高级学术应用SciSpace的技术快速精准的搜索文献论文

在学术研究领域,文献综述是非常重要的一个部分。它不仅是对已有研究的梳理和总结,更是对新研究方向的探索和定位。面对浩瀚的学术文献海洋,传统的检索方法往往显得力不从心,既耗时又低效。 随着ChatGPT技术的突破,我们终于可以摆脱这一束缚,迎来一种全新的、高效的文献检…

程序员 -买房历险记

快生日了&#xff0c;自己又又 涨了一岁 买房 真不是 一件简单的事。 一. 买房 三大核心问题 1.一手/二手 房 2.哪个城市买 3.哪个地方买 我调研的是 三四线城市&#xff08;俺的老家&#xff09; 二. 买房需要 花多少&#xff08;看得到/看不到&#xff09; 比如 4000元…

SEO(搜索引擎优化)指南

SEO&#xff08;Search Engine Optimization&#xff09;是通过优化网站内容、结构和外部链接&#xff0c;提升网页在搜索引擎结果中的排名&#xff0c;从而增加网站流量的过程。SEO 涉及多个层面&#xff0c;包括技术 SEO、内容优化、外部链接建设等。以下是 SEO 的核心优化策…

HTML图形

HTML图形 1. HTML5 Canvas2.HTML5 内联 SVG3.HTML 5 Canvas vs. SVG 1. HTML5 Canvas HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像。画布是一个矩形区域&#xff0c;您可以控制其每一像素。canvas 拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法。 1、创建…

『网络游戏』窗口基类【06】

创建脚本&#xff1a;WindowRoot.cs 编写脚本&#xff1a; 修改脚本&#xff1a;LoginWnd.cs 修改脚本&#xff1a;LoadingWnd.cs 修改脚本&#xff1a;ResSvc.cs 修改脚本&#xff1a;LoginSys.cs 运行项目 - 功能不变 本章结束

springboot整合mybatis案例

springboot通过整合mybatis来实现数据的呈现。 一、springInitializer创建项目 注意&#xff1a;不选择也可以&#xff0c;创建项目后在pom.xml配置文件中引入依赖 <!-- mybatis起步依赖--><dependency><groupId>org.mybatis</groupId><art…