NYOJ-467nbsp;中缀式变后缀式

2024-06-03 19:32
文章标签 后缀 nyoj 中缀 467nbsp

本文主要是介绍NYOJ-467nbsp;中缀式变后缀式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

中缀式变后缀式

时间限制: 1000 ms   内存限制: 65535 KB
难度: 3
描述
人们的日常习惯是把算术表达式写成中缀式,但对于机器来说更“习惯于”后缀式,关于算术表达式的中缀式和后缀式的论述一般的数据结构书都有相关内容可供参看,这里不再赘述,现在你的任务是将中缀式变为后缀式。
输入
第一行输入一个整数n,共有n组测试数据(n<10)。
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式的中缀式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。
数据保证除数不会为0
输出
每组都输出该组中缀式相应的后缀式,要求相邻的操作数操作符用空格隔开。
样例输入
2
1.000+2/4=
((1+2)*5+1)/4=
样例输出
1.000 2 4 / + =
1 2 + 5 * 1 + 4 / =

 

做题时在输出空格花了些时间

#define TRUE 1
#define FALSE 0
#define STACK_INIT_SIZE 10002

#include "iostream"
#include "cstdlib"
#include "cstdio"
#include "cstring"

using namespace std;

typedef int Status;  //Status 相当于 int
typedef struct Stack1 //运算符栈
{
 char * base;
 char * top;
}SqStack1;


//运算符栈操作
void  InitStack1(SqStack1 &S) //创建一个空栈
{

 S.base = (char *)malloc(sizeof(char) * STACK_INIT_SIZE);
 S.top = S.base;
}
Status Stack1Empty(SqStack1 S)//判断是否为空
{
 if(S.top == S.base) return TRUE;
 else return FALSE;
}
void Push1(SqStack1 &S,char e )//插入元素e为新的栈顶元素
{
 * S.top++ = e;
}
void Pop1(SqStack1 &S,char &e)//出栈
{
 e = * --S.top ;
}
char GetTop1(SqStack1 S)
{
 return *(S.top-1);
}
void TraverseStack1(SqStack1 S)//输出当前顺序表
{
 char * p = S.base;
 cout<<"运算栈中的元素为:";
 while( p != S.top  )
 {
  cout<<*p<<" ";
  p++;
 
 cout<<endl;
}

Status In(char ch)//判断ch是否为运算符
{
 if(ch == '+' || ch == '('|| ch == '-' || ch == '*' || ch == '/' || ch == ')'  || ch == '=') return TRUE;
 else return FALSE;
}


void In_to_Ne(char s[1002], char p[1002],int &l) 
{
 char c,ch;
 Stack1 S;   InitStack1(S);
 int i,k, len;
 k = 0;
 len = strlen(s);
 for(i = 0; i< len ; ++i)
 {
  c =s[i];
 // printf("c = %c\n",c);
  if( !In(c) )
  {
   while(!In(c) ){ 
              p[k++] = c;
     c = s[++i];
           
   p[k++] = ' ';
  }//操作数
  if( Stack1Empty(S) ) Push1(S,c);
  else if( c == '(' )  Push1(S,c);
  else if(c == ')'  )
  {
   while( GetTop1(S)!= '(')
   {
    Pop1(S,ch);p[k++] = ch; p[k++] =' ';
   }
   Pop1(S,ch); //将(出栈
  //将栈顶元素弹出并放到p 
  else if( (c == '+' || c=='-' )&&(GetTop1(S)=='(' ) )   Push1(S,c);
  else if( (c == '+' || c=='-' )&&(GetTop1(S) =='+' ||GetTop1(S)=='-'||GetTop1(S)=='*' ||GetTop1(S)=='/' ) ) {  Pop1(S,ch);  p[k++] = ch; p[k++] =' ';  i = i-1; //将栈顶元素弹出并放到p
  else if( (c == '*' || c=='/' )&&(GetTop1(S) =='+' ||GetTop1(S)=='-'|| GetTop1(S)=='(' ) )   Push1(S,c);
  else if( (c == '*' || c=='/' )&&(GetTop1(S) =='*' ||GetTop1(S)=='/') )   Pop1(S,ch);  p[k++] = ch; p[k++] =' '; i = i-1; //将栈顶元素弹出并放到p
 // TraverseStack1(S);
 }

 while(!Stack1Empty(S) )
 {
  Pop1(S,ch);  p[k++] = ch; p[k++] =' ';
 }
 l = k;
 return ;
}

int main()
{
 char s[1002], p[1002];
 int n,i,len;
 scanf("%d",&n);
 while(n--)
 {
  scanf("%s",s);
  In_to_Ne( s, p,len);
  for(i =0; i
   printf("%c",p[i]);
  printf("=\n");
 }
 return 0;
 

这篇关于NYOJ-467nbsp;中缀式变后缀式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

nyoj 288 士兵杀敌(五)

一道插线问线离线版的题  复杂度O(n); 代码如下: #include<stdio.h>#include<string.h>const int M = 1000003;const int mod=10003;int num[M];int main(){int n,c,q;scanf("%d%d%d",&n,&c,&q);while(c--){int a,b,x;scan

nyoj 1037 Postscript of Tian Ji racing

一道卡贪心的题。 也算一道改编题。 此题的解法推荐为二分图的最大匹配。 首先将输入数据转换一下,然后将满足题意的一组牌建立条边,最终边的覆盖数即为 LN 最后可得的分数。 然后求出最大匹配即可。 代码如下: #include<stdio.h>#include<string.h>char card[30][5];char s[5];int map[30][30];

nyoj 1002 Trucking

同样一道改编题。 只要把题意理解了好。 简单的二分加最短路。 只要二分高度, 然后求最短路,输出满足题意的即可。 代码如下: (最短路用spfa 时间效率高) #include <iostream>#include <cstdio>#include <cstring>#include <ctime>#include <queue>using namespace st

nyoj 1072 我想回家

一道相当题目描述相当扯的题。 这道题目的描述最后说的是求出到达最后一个点的最短距离,所以输入数据最后输入的城堡的坐标是没用的。 就是先求出两点之间的距离,若不大于村落间距离,并且不大于最后的距离限制 l ,则在两点间建边。 最后任意方法求出最短路即可。 #include <iostream>#include<stdio.h>#include<vector>#include<

nyoj 1038 纸牌游戏

poj 的一道改编题,说是翻译题更恰当,因为只是小幅度改动。 一道模拟题,代码掌控能力比较好,思维逻辑清晰的话就能AC。 代码如下: #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;struct node{char c[5];int rk;char da[5];int nu

nyoj 685 查找字符串

当初一开始没做出来。 后来,学习过一段时间之后,在返回来做这道题,忽然发现,map类容器可以做。 PS:需要注意的是:此题如果用c++的输入输出的话,会超时。 O(time):gets()<  scanf() < cin。   附上代码: #include<stdio.h>#include<map>#include<string>#include<string.h>usin

nyoj 695 Judging Filling Problems

一道强大的模拟题。。。 只要学会<string>类的运用即可。。。 注意: 1、细节的处理。 2、问题的分情况讨论。。 附上代码: 有好对缀余的地方,希望大神前来更新。 #include<stdio.h>#include<string.h>#include<string>#include<iostream>using namespace std;int num[1000

将浮点型算式的中缀表达式转换成后缀表达式并算出式子结果

最近因为需要了解如何将在Win应用程序控制台输入的算式表达式转化成其后缀表达式的算法,所以在网上搜索了一下,看到许多人的程序都只是对应于运算数在0~9的范围内的整型运算式,所以自己就写了一个可以计算浮点型算式的程序,一下是运行时的截图: 式子中的a,b,c是可供用户自行输入的变量。 首先,我先对输入的运算符进行了简单的合法性判断,我的判断代 码如下: //函数的传入参

后缀表达式转中缀表达式

假定有后缀表达式1 2 3 + 4 * +5 – ,请将它转化为前缀表达式。 利用表达式树: 1.从左到右扫面后缀表达式,一次一个符号读入表达式。2.如果符号是操作数,那么就建立一个单节点树并将它推入栈中。如果符号是操作符,那么就从栈中弹出两个树T1和T2(T1先弹出)并形成一颗新的树,该树的根就是操作符,它的左、右儿子分别是T2和T1(先出的为右子树,后出的为左子树)。然后将指向这棵新树的指

NYOJ 37 回文字符串(记忆化搜索)

OJ题目 : 戳这里~~ 描述 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba"。当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串。现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串。 输入 第一行给出整数N(0<N<100) 接下来的N行,每行一个字符串,每个字符串长度不超过1000.