有关栈的练习

栈练习1

给定一个栈(初始为空,元素类型为整数,且小于等于 109),只有两个操作:入栈和出栈。先给出这些操作,请输出最终栈的栈顶元素。
操作解释:
1 表示将一个数据元素入栈;
2 表示出栈。保证出栈的时候栈里数据不为空。

输入

第一行,一个数字 N,表示操作个数。1≤N≤10^5
其后 N 行,表示 N 个操作(如果是入栈则后面还会有一个入栈元素)。
具体见样例(输入保证栈空时不会出栈)。

输出

最终栈顶元素,若最终栈空,输出”impossible!”(不含引号)。

样例输入
3
1 2
1 9
2
样例输出
2
代码:
#include<bits/stdc++.h>
using namespace std;
stack<int>a;
int n,x,y;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>x>>y;
        if(x==2){
            a.pop();
        }
        else if(x==1){
            a.push(y);
        }
    }
    if(!a.empty())cout<<a.top();
    else cout<<"impossible!";
    return 0;
}

 栈练习2

此题与相比栈练习1改了 2 处:1、加强了数据,2、不保证栈空时不会出栈。
给定一个栈(初始为空,元素类型为整数,且小于等于 109),只有两个操作:入栈和出栈。先给出这些操作,请输出最终栈的栈顶元素。
操作解释:
1 表示将一个元素入栈;
2 表示出栈。出栈的时候栈可能为空。

输入

第一行,一个数字 N,表示操作个数。1≤N≤105。
其后 N 行,表示 N 个操作(如果是入栈则后面还会有一个入栈元素)。
具体见样例(输入不保证栈空时不会出栈)。

输出

最终栈顶元素。若最终栈空,或每次栈空时有出栈操作,输出”impossible!”(不含引号)。

样例输入
3
1 2
2
2
样例输出
impossible!
impossible!
代码:
#include<bits/stdc++.h>
using namespace std;
long long n,a,b;
stack<long long>s;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
    {
    	cin>>a;
    	if(a==1)
    	{
    		cin>>b;
    		s.push(b);
    	}
    	if(a==2)
    	{
    		if(!s.empty())s.pop();
    		else cout<<"impossible!"<<endl;
    	}
    }
    if(!s.empty())cout<<s.top();
    else cout<<"impossible!";
    return 0;
}

 栈练习3

比起栈练习1,本题加了另外一个操作,访问栈顶元素(编号 3,保证访问栈顶元素时或出栈时栈不为空),现在给出这 N 次操作,输出结果。

输入

第一行,一个数字 N,表示操作个数。1≤N≤105。
其后 N 行,表示 N 个操作:
1 入栈;入栈元素大小不会超过 109。
2 出栈;
3 访问栈顶。

输出

K行(K为中间询问的次数)每次的结果

样例输入
6
1  7
3
2
1  9
1  7
3
样例输出
7
7
代码:
#include<bits/stdc++.h>
using namespace std;
long long n,a,b;
stack<long long>s;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
    {
    	cin>>a;
    	if(a==1)
    	{
    		cin>>b;
    		s.push(b);
    	}
    	if(a==2)
    		s.pop();
    	if(a==3)
    		cout<<s.top()<<endl;
    }
    return 0;
}

栈练习4

比起栈练习3,本题不保证访问栈顶元素时或出栈时栈不为空,现在给出这 N 此操作,输出结果。

输入

第一行,一个数字 N,表示操作个数。1≤N≤105。
其后 N 行,表示 N 个操作:
1 入栈;入栈元素大小不会超过 109。
2 出栈;
3 访问栈顶。

输出

若干行每次的结果。
对于2操作。如果栈为空,每次操作输出 impossible!。
对于3操作。如果栈为空,每次操作输出 impossible!。如果栈不为空,输出对应的栈顶数据

样例输入
6
1  7
3
2
2
1  9
3
样例输出
7
impossible!
9
 代码:
#include<bits/stdc++.h>
using namespace std;
long long n,a,b;
stack<long long>s;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
    {
    	cin>>a;
    	if(a==1)
    	{
    		cin>>b;
    		s.push(b);
    	}
    	if(a==2)
    	{
    		if(!s.empty())s.pop();
    		else cout<<"impossible!"<<endl;
    	}
    	if(a==3)
    	{
    		if(!s.empty())cout<<s.top()<<endl;
    		else cout<<"impossible!"<<endl;
    	}
    }
    return 0;
}

洗盘子

晨晨和涵涵将联手洗掉 N (1<= N <= 10,000) 个脏盘子。晨晨洗,涵涵来擦干它们。每个盘子有一个指 定的编号,范围 1..N。开始,所有盘子按顺序排列在栈中(只能竖着叠放盘子的盒子), 1 号盘子在顶端, N 号盘子在底端。 
晨晨会先洗一些盘子,然后放在洗过的盘子栈里(这样与原来的顺序刚好颠倒)。然后,或者她洗别 的盘子,或者涵涵擦干她已经洗好的部分或全部盘子,放在擦干的盘子栈里。这样直到所有盘子洗完擦干 后放置的顺序是什么?
 



 

输入

第一行:一个整数 N,表示盘子的数量。 
接下来若干行:每一行两个整数,第一个整数为 1 表示洗盘子,为 2 表示擦盘子,第二个整数表示盘子数量

输出

共 N 行:擦干后盘子从顶端到底端的顺序

样例输入
5
1 3
2 2
1 2
2 3
样例输出
1
4
5
2
3
代码:
#include<bits/stdc++.h>
using namespace std;
long long n,x,y,bj;
stack<long long>a;
stack<long long>b;
stack<long long>c;
int main(){
    cin>>n;
    for(int i=n;i>=1;i--)
    	a.push(i);
    while(cin>>x>>y)
    {
    	if(x==1)
    	{
    		while(y>0)
    		{
    			b.push(a.top());
    			a.pop();
    			y--;
    		}
    	}
    	else
    	{
    		while(y>0)
    		{
    			c.push(b.top());
    			b.pop();
    			y--;
    			bj++;
    		}
    	}
    	if(bj==n)break;
    }
    while(!c.empty())
    {
    	cout<<c.top()<<endl;
    	c.pop();
    }
    return 0;
}

 程序员输入问题

程序员输入程序出现差错时,可以采取以下的补救措施:按错了一个键时,可以补按一个退格符“#”,以表示前一个字符无效;发现当前一行有错,可以按一个退行符“@”,以表示“@”与前一个换行符之间的字符全部无效。

输入

输入一行字符,个数不超过100。

输出

输出一行字符,表示实际有效字符。

样例输入
          sdfosif@for (ii#=1,#; i<.#=8; i+++#);
样例输出
for (i=1; i<=8; i++);
提示

因为输入只有一行,所以题目所讲的遇到@退行符就是清空当前栈里面所有元素

代码:
#include<bits/stdc++.h>
using namespace std;
string s,s1;
stack<char>a;
int main(){
    getline(cin,s);
    for(int i=0;i<s.size();i++)
    {
    	if(s[i]=='#')a.pop();
    	if(s[i]=='@')
    	{
    		while(!a.empty())
    		{
    			a.pop();
    		}
    	}
    	if(s[i]!='#'&&s[i]!='@')
    	{
    		a.push(s[i]);
    	}
    }
    while(!a.empty())
    {
    	s1=a.top()+s1;
    	a.pop();
    }
    cout<<s1;
    return 0;
}

表达式括号匹配

假设一个表达式有英文字母(小写)、运算符(+,—,*,/)和左右小(圆)括号构成,以“@”作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回“YES”;否则返回“NO”。表达式长度小于255,左圆括号少于20个。

输入

一行数据,即表达式。

输出

一行,即“YES” 或“NO”。

样例输入
2*(x+y)/(1-x)@
样例输出
YES
代码:
#include<bits/stdc++.h>
using namespace std;
stack<char>a;
int main()
{
	char ch;
	cin>>ch;
	while(ch!='@')
	{
		if(ch=='(')a.push(ch);
		else if(ch==')' && a.empty())
		{
			cout<<"NO";
			return 0;
		}
		else if(ch==')')a.pop();
		cin>>ch;
	}
	if(a.empty())cout<<"YES"; 
	else cout<<"NO";
	return 0;
}

 括弧匹配检验

假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,如([ ]())或[([ ][ ])]等为正确的匹配,[( ])或([ ]( )或 ( ( ) ) )均为错误的匹配。
现在的问题是,要求检验一个给定表达式中的括弧是否正确匹配?
输入一个只包含圆括号和方括号的字符串,判断字符串中的括号是否匹配,匹配就输出 “OK” ,不匹配就输出“Wrong”。输入一个字符串:[([][])],输出:OK。

输入

输入仅一行字符(字符个数小于255)。

输出

匹配就输出 “OK” ,不匹配就输出“Wrong”。

样例输入
[(])
样例输出
Wrong
代码:
#include<bits/stdc++.h>
using namespace std;
int top;
bool f;
int main(){
	string s; 
	char a[3000];
	cin>>s;
	int l=s.size(),n,m;
	for(int i=0;i<l;i++){
		if(s[i]=='('||s[i]==')')n++;
		if(s[i]=='['||s[i]==']')m++;
		if(s[i]=='('||s[i]=='[')a[++top]=s[i];
        if(s[i]==')'){
            if(a[top]=='(')top--;
            else{
                f=1;
                break;
            }
        }
        if(s[i]==']'){
            if(a[top]=='[')top--;
        	else{
                f=1;
                break;
            }
        }
    }
    if(n%2==1||m%2==1){
        cout<<"Wrong";
       	return 0;
	}
    if(f==1)cout<<"Wrong";
    else cout<<"OK";
	return 0;
}

 符号匹配

假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,如([ ]())或[([ ][ ])]等为正确的匹配,[( ])或([ ]( )或 ( ( ) ) )均为错误的匹配。
现在的问题是,要求检验一个给定表达式中的括弧是否正确匹配?
输入一个只包含圆括号和方括号的字符串,判断字符串中的括号是否匹配,匹配就输出 “YES” ,不匹配就输出“NO”。输入一个字符串:[([][])],输出:YES。

输入

输入包括多组测试数据,每组数据是一个字符串,字符串只包含“()[]”等字符。

输出

对于每组数据输出“YES”表示当前字符串中的括号是匹配的,否则输出“NO”(不包括引号)

样例输入
()
([)]
样例输出
YES
NO
代码:
#include<bits/stdc++.h>
using namespace std;
string s; 
int main(){
    while(cin>>s){
        int top=0;
        bool f=0;
        char a[3000];
        for(int i=0;i<=2999;i++)a[i]=' ';
        int l=s.size(),n=0,m=0;
        for(int i=0;i<l;i++){
        	if(s[i]=='('||s[i]==')')n++;
        	if(s[i]=='['||s[i]==']')m++;
        	if(s[i]=='('||s[i]=='[')a[++top]=s[i];
            if(s[i]==')'){
                if(a[top]=='(')top--;
                else{
                    f=1;
                    break;
                }
            }
            if(s[i]==']'){
                if(a[top]=='[')top--;
            	else{
                    f=1;
                    break;
                }
            }
        }
        if(n%2==1||m%2==1){
            cout<<"NO\n";
            continue;
        }
        if(f==1)cout<<"NO\n";
        else cout<<"YES\n";
    }
        
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

平衡二叉树(后序遍历,力扣110)

解题思路&#xff1a;采取后序遍历的好处是先遍历节点得到高度&#xff0c;然后再判断高度差是否大于一&#xff0c;如果是的话就返回-1&#xff0c;不是就返回两高度中较大的高度加一就是父节点的高度 具体代码如下&#xff1a; class Solution { public: int travel(TreeN…

antDesign Form表单校验(react)

<script><Form name"basic" ref{formRef} onFinish{onFinish}><Form.Itemlabel校验name"check"rules{[// 校验必填{required: true,message: 请输入&#xff01;},// 校验输入字符数限制{validator: (_, value) >value && value…

TCP三次握手,但通俗理解

如何用通俗的语言来解释TCP&#xff08;传输控制协议&#xff09;的三次握手过程&#xff1f; 想象一下你正在和朋友电话沟通&#xff0c;但你们之间不是心灵感应&#xff0c;而是需要通过清晰地听到对方的声音来确认通话质量良好。TCP三次握手就像是在电话拨通之前&#xff0…

OMNeT++与无线通信网络仿真——第二部分INET框架介绍 阅读笔记

13.5 熟悉INET框架 INET框架建立在Omnet基础上&#xff0c;并且使用相同的概念&#xff0c;即模块通过消息传递通信。 主机、路由器、交换机和其他网络设备有OMNeT复合模块表示。这些复合模块由表示协议、应用和其他功能单元的简单模块组成。网络又是一次包含主机、路由器和其…

怎么把网页上的文字变小?

以下是针对常见浏览器的说明&#xff1a; ### Google Chrome&#xff1a; 1. 打开 Chrome 浏览器并导航到您想要调整文字大小的网页。 2. 在页面上右键单击空白处&#xff0c;然后选择 "检查" 或按下 CtrlShiftI&#xff08;在 Windows 或 Linux 上&#xff09;或 Co…

混合现实(MR)开发框架

混合现实&#xff08;MR&#xff09;开发框架为开发者提供了构建MR应用程序所需的基本工具和功能。它们通常包括3D引擎、场景图、输入系统、音频系统、网络功能以及支持同时处理现实世界和虚拟世界信息的功能。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&…

java-springmvc 01

MVC就是和Tomcat有关。 01.MVC启动的第一步&#xff0c;启动Tomcat 02.Tomcat会解析web-inf的web.xml文件

java-spring 图灵 04 doscan方法,重点是scanCandidateComponents方法

01.本次的重点依旧是扫描函数&#xff0c;这次是spring中的源码&#xff1a; 02.第一步&#xff0c;构造AnnotationConfigApplicationContext 主方法&#xff1a; public static void main(String[] args) {// 创建一个Spring容器AnnotationConfigApplicationContext applica…

我们一起看看《看漫画学C++》中如何讲解对象的动态创建与销毁

《看漫画学C》这本书中会用图文的方式生动地解释对象的动态创建与销毁。在C中&#xff0c;动态创建对象是通过new运算符来实现的&#xff0c;而销毁对象则是通过delete运算符来完成的。这种方式可以让程序在需要时分配内存给对象&#xff0c;并在对象不再需要时释放内存&#x…

MambaDFuse:一种基于mamba的多模态图像融合双相位模型

MambaDFuse:一种基于mamba的多模态图像融合双相位模型 摘要IntroductionRelated WorksMethodComparison with SOTA methodsAblation StudyDownstream IVF applications Conclusion 摘要 多模态图像融合&#xff08;MMIF&#xff09;旨在将来自不同模态的互补信息整合到单一的融…

(四)相关性分析 学习简要笔记 #统计学 #CDA学习打卡

目录 一. 相关性分析简介 二. 相关性分析方法 1&#xff09;连续型变量vs连续型变量&#xff1a;Pearson/Spearman &#xff08;a&#xff09;Pearson &#xff08;b&#xff09;Spearman等级相关系数 2&#xff09;二分类变量&#xff08;自然&#xff09;vs连续型变量&…

【C++干货基地】面向对象核心概念 const成员函数 | 初始化列表 | explicit关键字 | 取地址重载

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…

前端从零到一搭建脚手架并发布到npm

这里写自定义目录标题 一、为什么需要脚手架&#xff1f;二、前置-第三方工具的使用1. 创建demo并运行-4步新建文件夹 zyfcli&#xff0c;并初始化npm init -y配置入口文件 2.commander-命令行指令3. chalk-命令行美化工具4. inquirer-命令行交互工具5. figlet-艺术字6. ora-lo…

Oracle数据库的简单使用

Oracle简单使用 一、数据库的介绍二、Oracle介绍账号管理Oracle的安装Oracle服务的作用OracleRemExecService服务创建数据库 常用命令 三、SQL语言SQL分类实用的数据表添加注释数据操纵语言&#xff08;DML&#xff09;查询语句&#xff08;SELECT&#xff09;wherelikedistinc…

ShardingSphere:强大的分布式数据库中间件【图文】

ShardingSphere的诞生 ShardingSphere的结构 Sharding-JDBC :它提供了一个轻量级的 Java 框架&#xff0c;在 Java 的 JDBC 层提供额外的服务。使用客户端直连数据库&#xff0c;以 jar 包形式提供服务&#xff0c;无需额外部署和依赖&#xff0c;可理解为增强版的 JDBC 驱动&…

如何使用 Cloudflare 和 Mailgun 设置自定义电子邮件

作为一名软件工程师&#xff0c;您可能考虑拥有一个专业的电子邮件账户&#xff0c;以及自己的网站&#xff0c;比如 “infoexample.com”. 但这可能会花费一定金额&#xff0c;您可能不愿意支付。 但您知道您可以免费做到吗&#xff1f;事实上&#xff0c;有一种方法可以做到…

error解决expression before ‘static‘

问题现象 报警如下 跳转到提示第125行&#xff0c;但是这行明显是没有问题的。 问题分析 经过排查可以看到&#xff0c;是120行的末尾\在S32DS编译器里面被认为是“接下一行”的意思&#xff0c;120行注释掉之后&#xff0c;后面的121行、122行、123行均被注释掉&#xff0c;…

得物sign参数逆向分析与Python算法还原

文章目录 1. 写在前面2. 接口分析3. 断点分析4. Python算法还原 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚…

bp神经网络拟合函数未知参数【源码+视频教程】

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《复杂函数拟合案例分享》本专栏旨在提供 1.以案例的形式讲解各类复杂函数拟合的程序实现方法&#xff0c;并提供所有案例完整源码&#xff1b;2.…

Linux 操作系统非缓冲区的文件操作、时间编程

1、文件操作 1.1 基于缓冲区的文件操作 基于缓冲区的文件操作---高级Io 以f开头的是基于缓冲区的文件操作 printf是一个基于缓冲区的函数 输出条件&#xff1a; 1.程序正常运行 2.遇到换行\n也能输出 3.缓存区内存已满 1024大小 4.遇到fflush&#xff08;stdout&a…
最新文章