UVa11234 表达式

题意:题目意思是给出后缀表达式,可以通过栈来计算表达式的值,即转化为中缀表达式。然后如果现在不用栈,而是用队列来操作,即每遇到一操作符时,进行两次pop和一次push。(这里注意,先pop出来的作为第二操作数,操作符假设是不满足交换律和结合律的)因为队列的pop和push,与栈的不同么,所以,问队列的输入应该是怎样的,才能和给定的输入用栈来计算,所得值相同。(即转化为相同的中缀表达式)

思路:先转为表达式树,然后可以看到用队列的方式即为层次遍历(队列实现)这棵树,然后将值逆序输出。

这里树的链式存储我没有用到内存动态分配、指针等容易出错的东西。我是先声明了一个MAXN个的Node数组anode,然后每个字符来这个数组申请node,用cnt来索引,位置0不存储数据,用索引0来表示不存在的结点,即相当于null。node结点中的left和right即为左右孩子结点在anode数组中的下标。建树的过程即函数build中用到的栈也是存相应结点在anode数组中的下标。

(好久没做题了,这个还一次AC了啊;之前在UVa单题最高排名也一百多,这个题排到77,破纪录了嘿嘿

年轻是一种债务,要加油~)

Code:

#include<stdio.h>
#include<string.h>
#define MAXN 10000

struct Node
{
 char data;
 int left,right;      //存的是anode数组的下标
};
void bfs(int root);
int build(char *str);

Node anode[MAXN];
int stack[MAXN+1];
char exp[MAXN+1];

int main()
{
 int n;
 scanf("%d",&n);
 while(n-->0)
 {
  scanf("%s",exp);
  int root=build(exp);//printf("%d\n",root);
  bfs(root);
 }
 return 0;
}

void bfs(int root)
{
 int que[MAXN];
 char ans[MAXN];
 int cnt=0;
 int front=0,rear=1;
 que[0]=root;
 while(front<rear)
 {
  int t=que[front++];
  ans[cnt++]=anode[t].data;
  if(anode[t].left!=0) que[rear++]=anode[t].left;
  if(anode[t].right!=0) que[rear++]=anode[t].right;
 }
 ans[cnt]='\0';
 //print      //printf("%s\n",ans);
 for(int i=0;i<cnt;++i)
  printf("%c",ans[cnt-i-1]);
 printf("\n");
}

int build(char *str)
{
 int cnt=1;//anode数组的下标0元素表示不存在该结点
 int top=0;//始终指向栈顶元素,stack[0]不用
 while((*str)!='\0')
 {
  anode[cnt].data=*str;
  if(*str>='a'&&*str<='z')
  {
   anode[cnt].left=anode[cnt].right=0;
   stack[++top]=cnt;
  }
  else
  {
   if(top>1)
   {
    anode[cnt].right=stack[top--];
    anode[cnt].left=stack[top--];
   }
   stack[++top]=cnt;
  }
  str++;
  cnt++;
 }//while
 return cnt-1;
}
时间: 2025-01-03 16:24:05

UVa11234 表达式的相关文章

.NET深入解析LINQ框架(六:LINQ执行表达式)

阅读目录: 1.LINQ执行表达式 在看本篇文章之前我假设您已经具备我之前分析的一些原理知识,因为这章所要讲的内容是建立在之前的一系列知识点之上的,为了保证您的阅读顺利建议您先阅读本人的LINQ系列文章的前几篇或者您已经具备比较深入的LINQ原理知识体系,防止耽误您的宝贵时间. 到目前为止我们对LINQ的执行原理已经很清楚了,从它的前期构想到它真正为我们所用都有足够的证据,但是似乎问题并没有我们想的那么简单,问题总是在我们使用中频频出现尤其是新技术的使用,当然有问题才能有进步. 一:LINQ执行

Lambda表达式实战视频教程

视频教程地址: https://my.oschina.net/u/3217554/blog/1507456 1:Lambda表达式及函数式接口介绍 2:Lambda表达式详解 3:方法的引用(一) 4:方法的引用(二) 5:Stream API(一) 6:Stream API(二) 7:Lambda表达式.方法的引用.Stream API实战

lambda表达式封装对数据库的查询

前言: 1.为什么要封装lambda表达式数据库查询,原因有一下几点: 1.1.在以往的开发中进行数据库表查询时,其实所需要的字段就是其中几个,但是在开发中,开发者往往习惯select * 进行查询,当数据多和用户量多时,查询的效率会降低. 1.2.在写查询where条件的时候,总是用string.format去拼接字符串,开发效率低. 1.3.代码不够优雅,代码中嵌套和多sql语句,如果是表字段发生改变时编译器检查不出来,代码出错的概率大. 1.4.本着 write less  do more

坑爹的EL 表达式。

先说结论: Property 'OrgName0' not found on type EL表达式只与相关类的get方法的有关,就算你没定义变量,get 方法直接返回一个变量,或者常量都可以.这条没问题. EL表达式的大小写规则:当get方法后的字符如果前两个都是大写时,EL表达式需要大写.除此之外均为小写. package com.dobs.codedeploy.domain; public class Image { private String imageName;private Stri

Spring AOP中pointcut expression表达式解析 及匹配多个条件

Pointcut 是指那些方法需要被执行"AOP",是由"Pointcut Expression"来描述的. Pointcut可以有下列方式来定义或者通过&& || 和!的方式进行组合. args() @args() execution() this() target() @target() within() @within() @annotation 其中 execution 是用的最多的,其格式为: execution(modifiers-pat

Lambda表达式

import org.junit.Test; import java.util.Comparator; import java.util.function.Consumer; /** * 一.Lambda 表达式基础语法:Java8中引入一个新的操作符"->"该操作符称为箭头操作符或Lambda操作符 * 箭头操作符将Lambda表达式拆分为两部分: * 左侧: Lambda表达式的参数列表 * 右侧: Lambda表达式中所需要执行的功能,即Lambda体 * * 语法格式一:

算法训练 表达式计算

问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的值. 样例输入 1-2+3*(4-5) 样例输出 -4 数据规模和约定 表达式长度不超过100,表达式运算合法且运算过程都在int内进行. import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.ArrayList; import java.uti

JAVAWEB开发之Session的追踪创建和销毁、JSP详解(指令,标签,内置对象,动作即转发和包含)、JavaBean及内省技术以及EL表达式获取内容的使用

Session的追踪技术 已知Session是利用cookie机制的服务器端技术,当客户端第一次访问资源时 如果调用request.getSession() 就会在服务器端创建一个由浏览器独享的session空间,并分配一个唯一且名称为JSESSIONID的cookie发送到浏览器端,如果浏览器没有禁用cookie的话,当浏览器再次访问项目中的Servlet程序时会将JSESSIONID带着,这时JSESSIONID就像唯一的一把钥匙  开启服务器端对应的session空间,进而获取到sessi

正则 常用表达式

说明 正则表达式 网址(URL) [a-zA-z]+://[^\s]* IP地址(IP Address) ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?) 电子邮件(Email) \w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* QQ号码 [1-9]\d{4,} HTML标记(包含内容或自闭合) <(.*)(.*)>.*<\/\1>|<(.*) \/>