UVa11234 表达式
题意:题目意思是给出后缀表达式。能够通过栈来计算表达式的值,即转化为中缀表达式。
然后如果如今不用栈。而是用队列来操作。即每遇到一操作符时。进行两次pop和一次push。(这里注意,先pop出来的作为第二操作数,操作符如果是不满足交换律和结合律的)由于队列的pop和push,与栈的不同么,所以。问队列的输入应该是如何的,才干和给定的输入用栈来计算,所得值同样。(即转化为同样的中缀表达式)
思路:先转为表达式树。然后能够看到用队列的方式即为层次遍历(队列实现)这棵树,然后将值逆序输出。
这里树的链式存储我没实用到内存动态分配、指针等easy出错的东西。
我是先声明了一个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;
}
UVa11234 表达式的更多相关文章
- 【.net 深呼吸】细说CodeDom(2):表达式、语句
在上一篇文章中,老周厚着脸皮给大伙介绍了代码文档的基本结构,以及一些代码对象与CodeDom类型的对应关系. 在评论中老周看到有朋友提到了 Emit,那老周就顺便提一下.严格上说,Emit并不是针对代 ...
- 你知道C#中的Lambda表达式的演化过程吗?
那得从很久很久以前说起了,记得那个时候... 懵懂的记得从前有个叫委托的东西是那么的高深难懂. 委托的使用 例一: 什么是委托? 个人理解:用来传递方法的类型.(用来传递数字的类型有int.float ...
- 再讲IQueryable<T>,揭开表达式树的神秘面纱
接上篇<先说IEnumerable,我们每天用的foreach你真的懂它吗?> 最近园子里定制自己的orm那是一个风生水起,感觉不整个自己的orm都不好意思继续混博客园了(开个玩笑).那么 ...
- Linq表达式、Lambda表达式你更喜欢哪个?
什么是Linq表达式?什么是Lambda表达式? 如图: 由此可见Linq表达式和Lambda表达式并没有什么可比性. 那与Lambda表达式相关的整条语句称作什么呢?在微软并没有给出官方的命名,在& ...
- 背后的故事之 - 快乐的Lambda表达式(一)
快乐的Lambda表达式(二) 自从Lambda随.NET Framework3.5出现在.NET开发者眼前以来,它已经给我们带来了太多的欣喜.它优雅,对开发者更友好,能提高开发效率,天啊!它还有可能 ...
- Kotlin的Lambda表达式以及它们怎样简化Android开发(KAD 07)
作者:Antonio Leiva 时间:Jan 5, 2017 原文链接:https://antonioleiva.com/lambdas-kotlin/ 由于Lambda表达式允许更简单的方式建模式 ...
- SQL Server-表表达式基础回顾(二十四)
前言 从这一节开始我们开始进入表表达式章节的学习,Microsoft SQL Server支持4种类型的表表达式:派生表.公用表表达式(CTE).视图.内嵌表值函数(TVF).简短的内容,深入的理解, ...
- 立即执行函数表达式(IIFE)
原文地址:benalman.com/news/2010/11/immediately-invoked-function-expression/ 译者:nzbin 也许你还没有注意到,我是一个对术语比较 ...
- javascript:逆波兰式表示法计算表达式结果
逆波兰式表示法,是由栈做基础的表达式,举个例子: 5 1 2 + 4 * + 3 - 等价于 5 + ((1 + 2) * 4) - 3 原理:依次将5 1 2 压入栈中, 这时遇到了运算符 + ...
随机推荐
- ACM程序设计选修课——Problem F:(ds:图)旅游规划(优先队列+SPFA)
问题 F: (ds:图)旅游规划 时间限制: 1 Sec 内存限制: 128 MB 提交: 14 解决: 4 题目描述 有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路 ...
- 刷题总结——run(ssoj)
题目: 题目描述 企鹅国正在举办全面运动会,第一项比赛就是跑步.N 个人在圆形跑道上跑步,他们都有各自的速度和起点.但这个跑步规则很奇怪,当两个人相遇的时候编号较小的就会出局,当场上剩下最后一个人的时 ...
- Python tldextract模块准确获取域名和后缀
Python tldextract 模块 - 功能说明 tldextract准确地从URL的域名和子域名分离通用顶级域名或国家顶级域名. 例如,http://www.google.com,你只想取出连 ...
- element-ui 的 upload组件的clearFiles方法调用方法
<template> <div> <el-button @click="clearUploadedImage">重新上传</el-butt ...
- 【POJ3321】Apple Tree(DFS序,树状数组)
题意:给一棵n个节点的树,每个节点开始有一个苹果,m次操作 1.将某个结点的苹果数异或 1 2.查询一棵子树内的苹果数 n,m<=100000 思路:最近一段时间在思考树上统计问题的算法 发 ...
- Oracle Dual 表详解
1.DUAL表的用途Dual 是 Oracle中的一个实际存在的表,任何用户均可读取,常用在没有目标表的Select语句块中--查看当前连接用户SQL> select user from dua ...
- 转 Python爬虫入门一之综述
转自: http://cuiqingcai.com/927.html 静觅 » Python爬虫入门一之综述 首先爬虫是什么? 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为 ...
- linux 目标文件调试
前言如果普通编程不需要了解这些东西,如果想精确控制你的对象文件的格式或者你想查看一下文件对象里的内容以便作出某种判断,刚你可以看一下下面的工具:objdump, nm, ar.当然,本文不可能非常详细 ...
- Day 18 函数之一
函数参数: 1.形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元.因此,形参只在函数内部有效.函数调用结束返回主调用函数后则不能再使用该形参变量 2.实参可以是常量.变量. ...
- AC日记——图灵机游戏 codevs 2292
2292 图灵机游戏 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description [Shadow 1]第二题 ...