nyoj257郁闷的c小加(一)(栈和队列)

2024-02-16 11:08
文章标签 队列 郁闷 小加 nyoj257

本文主要是介绍nyoj257郁闷的c小加(一)(栈和队列),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

郁闷的C小加(一)

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 3
描述

我们熟悉的表达式如a+ba+b*(c+d)等都属于中缀表达式。中缀表达式就是(对于双目运算符来说)操作符在两个操作数中间:num1 operand num2。同理,后缀表达式就是操作符在两个操作数之后:num1 num2 operandACM队的“C小加”正在郁闷怎样把一个中缀表达式转换为后缀表达式,现在请你设计一个程序,帮助C小加把中缀表达式转换成后缀表达式。为简化问题,操作数均为个位数,操作符只有+-*/ 和小括号。

输入
第一行输入T,表示有T组测试数据(T<10)。
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个表达式。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。并且输入数据不会出现不匹配现象。
输出
每组输出都单独成行,输出转换的后缀表达式。
样例输入
21+2(1+2)*3+4*5
样例输出

12+12+3*45*+



/**
思路:
使用一个栈,用来存放运算符;使用一个队列 ,后缀表达式;
将输入的字符串从左到右扫描一遍,如果遇到数字,则直接进入队列;
如果遇到“(”,直接进入栈,如果遇到“)”,将栈中的运算符出栈,进入队列;
如果遇到'+','-','*','/',将当前遇到的运算符str[i]与栈头的运算符opt1.top()进行优先级比较,如果str[i]的优先级小于opt1.top()的优先级,则将opt1.top()入队,将str[i]进栈, 
*/#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stack>
#include<queue>
using namespace std;
int t;
char str[1010];
//stack<char>opt1;//存放运算符的栈 
//queue<char>opt2;//存放后缀表达式的队列 
int compare(char op)//设置操作符的优先级 
{if(op=='+'||op=='-'){return 1;}else if(op=='*'||op=='/'){return 2;}return 0;
}
int main()
{stack<char>opt1;queue<char>opt2;scanf("%d",&t);getchar();while(t--){while(!opt1.empty())opt1.pop();while(!opt2.empty())opt2.pop();scanf("%s",str);int len=strlen(str);opt1.push('#');for(int i=0;i<len;i++){if(str[i]>='0'&&str[i]<='9'){opt2.push(str[i]);//如果是数字,直接入队 }if(str[i]=='(')//遇到"("直接进栈 {opt1.push(str[i]);}if(str[i]==')'){while(opt1.top()!='('){//char s1=opt1.top();//	opt2.push(s1);opt2.push(opt1.top());opt1.pop();}opt1.pop();//最后把“(”出栈,但不输出 }else if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/'){char s=opt1.top();while(compare(str[i])<=compare(opt1.top()))//<=就可以,小于不可以,为什么??不解!! {opt2.push(s);opt1.pop();s=opt1.top();}opt1.push(str[i]);}}while(!opt1.empty()){opt2.push(opt1.top());opt1.pop();}while(opt2.front()!='#')// 不以'#'结尾居然不对,不解??? {printf("%c",opt2.front());opt2.pop();}printf("\n");}return 0;
}



#include<stdio.h>
#include<string.h>
#include<stack>
#include<algorithm>
using namespace std;
int t;
char str[1010];
char compare(char s,char z)//操作符优先级比较函数 
{if(s=='+'||s=='-'){if(z=='*'||z=='/'||z=='(')return '<';else return '>';}if(s=='*'||s=='/'){if(z=='(')return '<';else return '>';}if(s==')') return '<';if(s=='('||s=='#'){if((s=='('&&z==')')||(s=='#'&&z=='#'))return '=';else return '<';}
}
int main()
{stack<char>opt;int flag=0;char ch;scanf("%d",&t);getchar();while(t--){scanf("%s",str);int len=strlen(str);while(!opt.empty()){opt.pop();}opt.push('#');str[len]='#';for(int i=0;i<=len;){if(str[i]=='#'&&opt.top()=='#'){break;}if(str[i]>='0'&&str[i]<='9'||str[i]=='.'){printf("%c",str[i]);i++;flag=1;continue;} switch(compare(opt.top(),str[i])){case '<':opt.push(str[i]);i++;break;case '=':opt.pop();i++;break;case '>':ch=opt.top();opt.pop();printf("%c",ch);compare(opt.top(),str[i]);break;}}printf("\n");} return 0;
}


这篇关于nyoj257郁闷的c小加(一)(栈和队列)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/714348

相关文章

hdu1180(广搜+优先队列)

此题要求最少到达目标点T的最短时间,所以我选择了广度优先搜索,并且要用到优先队列。 另外此题注意点较多,比如说可以在某个点停留,我wa了好多两次,就是因为忽略了这一点,然后参考了大神的思想,然后经过反复修改才AC的 这是我的代码 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<

poj 3190 优先队列+贪心

题意: 有n头牛,分别给他们挤奶的时间。 然后每头牛挤奶的时候都要在一个stall里面,并且每个stall每次只能占用一头牛。 问最少需要多少个stall,并输出每头牛所在的stall。 e.g 样例: INPUT: 51 102 43 65 84 7 OUTPUT: 412324 HINT: Explanation of the s

poj 2431 poj 3253 优先队列的运用

poj 2431: 题意: 一条路起点为0, 终点为l。 卡车初始时在0点,并且有p升油,假设油箱无限大。 给n个加油站,每个加油站距离终点 l 距离为 x[i],可以加的油量为fuel[i]。 问最少加几次油可以到达终点,若不能到达,输出-1。 解析: 《挑战程序设计竞赛》: “在卡车开往终点的途中,只有在加油站才可以加油。但是,如果认为“在到达加油站i时,就获得了一

poj3750约瑟夫环,循环队列

Description 有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序。 Input 第一行输入小孩的人数N(N<=64) 接下来每行输入一个小孩的名字(人名不超过15个字符) 最后一行输入W,S (W < N),用

POJ2010 贪心优先队列

c头牛,需要选n头(奇数);学校总共有f的资金, 每头牛分数score和学费cost,问合法招生方案中,中间分数(即排名第(n+1)/2)最高的是多少。 n头牛按照先score后cost从小到大排序; 枚举中间score的牛,  预处理左边与右边的最小花费和。 预处理直接优先队列贪心 public class Main {public static voi

Java并发编程之——BlockingQueue(队列)

一、什么是BlockingQueue BlockingQueue即阻塞队列,从阻塞这个词可以看出,在某些情况下对阻塞队列的访问可能会造成阻塞。被阻塞的情况主要有如下两种: 1. 当队列满了的时候进行入队列操作2. 当队列空了的时候进行出队列操作123 因此,当一个线程试图对一个已经满了的队列进行入队列操作时,它将会被阻塞,除非有另一个线程做了出队列操作;同样,当一个线程试图对一个空

FreeRTOS学习笔记(六)队列

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、队列的基本内容1.1 队列的引入1.2 FreeRTOS 队列的功能与作用1.3 队列的结构体1.4 队列的使用流程 二、相关API详解2.1 xQueueCreate2.2 xQueueSend2.3 xQueueReceive2.4 xQueueSendFromISR2.5 xQueueRecei

多线程篇(阻塞队列- LinkedBlockingDeque)(持续更新迭代)

目录 一、LinkedBlockingDeque是什么 二、核心属性详解 三、核心方法详解 addFirst(E e) offerFirst(E e) putFirst(E e) removeFirst() pollFirst() takeFirst() 其他 四、总结 一、LinkedBlockingDeque是什么 首先queue是一种数据结构,一个集合中

Java消息队列:RabbitMQ与Kafka的集成与应用

Java消息队列:RabbitMQ与Kafka的集成与应用 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿! 在现代的分布式系统中,消息队列是实现系统间通信、解耦和提高可扩展性的重要组件。RabbitMQ和Kafka是两个广泛使用的消息队列系统,它们各有特点和优势。本文将介绍如何在Java应用中集成RabbitMQ和Kafka,并展示它们的应用场景。 消息队

多线程篇(阻塞队列- LinkedBlockingQueue)(持续更新迭代)

目录 一、基本概要 1. 构造函数 2. 内部成员 二、非阻塞式添加元素:add、offer方法原理 offer的实现 enqueue入队操作 signalNotEmpty唤醒 删除线程(如消费者线程) 为什么要判断if (c == 0)时才去唤醒消费线程呢? 三、阻塞式添加元素:put 方法原理 图解:put线程的阻塞过程 四、非阻塞式移除:poll方法原理 dequ