E81086713E446D36F62B2AA2A3502B5EB155
Java杂家
最小割等于最大流
BlogJava
首页
新随笔
联系
聚合
管理
32 Posts :: 0 Stories :: 93 Comments :: 0 Trackbacks
公告
所有文章和代码除非特别说明, 均为本blog作者原创,转载请注明出处和原作者. 谢谢!
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(8)
给我留言
查看公开留言
查看私人留言
随笔分类
Memorandum (14)
随笔档案
2008年6月 (3)
2008年5月 (1)
2008年3月 (2)
2008年2月 (1)
2007年12月 (9)
2007年10月 (2)
2007年9月 (1)
2007年8月 (1)
2007年7月 (2)
2007年5月 (2)
2007年4月 (1)
2007年3月 (2)
2007年2月 (1)
2007年1月 (4)
搜索
积分与排名
积分 - 47671
排名 - 212
最新评论
1. re: 排序算法复习(Java实现)(二): 归并排序,堆排序,桶式排序,基数排序
非常好,收藏,研究研究
--first
2. re: 排序算法复习(Java实现)(一): 插入,冒泡,选择,Shell,快速排序
很好,都能用
--first
3. re: 使用赢者树的外部排序[未登录]
请问 这个排序怎么用?
--jason
4. re: Java转EXE文件工具
不知道怎么用啊
--工
5. re: Java转EXE文件工具
请问,我的Main类启动需要args 参数,我如何设定呢?
--你好
阅读排行榜
1. 排序算法复习(Java实现)(一): 插入,冒泡,选择,Shell,快速排序(3914)
2. 排序算法复习(Java实现)(二): 归并排序,堆排序,桶式排序,基数排序(2570)
3. 红黑树的Java实现(2532)
4. 在Spring中发布SOAP HTTP Webservice(2126)
5. 2008百度之星资格赛第二场第三题——传输方案规划 (2035)
评论排行榜
1. Java转EXE文件工具(20)
2. Java2EXE Builder 1.0.0(9)
3. Java转EXE工具(二)[也谈Splash Screen实现](8)
4. 重写Jav2EXE Builder Platform(7)
5. 排序算法复习(Java实现)(二): 归并排序,堆排序,桶式排序,基数排序(6)
表达式求值Java粗糙版
/**
*
*/
package
com.yovn.algo;
import
java.util.Stack;
import
java.util.Vector;
/**
*
@author
yovn
*
*/
public
class
Caculator {
class
Item
{
boolean
ops;
int
value;
Character opVal;
int
opPriority;
}
Stack
<
Item
>
opStack
=
new
Stack
<
Item
>
();
Vector
<
Item
>
calcStack
=
new
Vector
<
Item
>
();
/**
*
*/
public
Caculator() {
//
TODO Auto-generated constructor stub
}
public
int
calc()
{
Stack
<
Item
>
tmp
=
new
Stack
<
Item
>
();
while
(
!
calcStack.isEmpty())
{
Item it
=
calcStack.remove(
0
);
if
(
!
it.ops)
{
tmp.push(it);
}
else
{
int
op2
=
tmp.pop().value;
int
op1
=
tmp.pop().value;
Item newItem
=
new
Item();
newItem.ops
=
true
;
switch
(it.opVal)
{
case
'
+
'
:
newItem.value
=
op1
+
op2;
break
;
case
'
-
'
:
newItem.value
=
op1
-
op2;
break
;
case
'
*
'
:
newItem.value
=
op1
*
op2;
break
;
case
'
/
'
:
newItem.value
=
op1
/
op2;
break
;
}
tmp.push(newItem);
}
}
return
tmp.pop().value;
}
/**
* 1)数字直接输出
* 2)开括号则压栈
* 3)闭括号把栈中元素依次输出直到遇到开括号
* 4)运算符时
* a)循环,当栈非空,并且栈顶元素不是开括号,并且栈顶运算符优先级不低于输入的运算符的优先级,反复将其输出
* b)把输入运算符压栈
* 5)输出栈内剩余元素
*
@param
in
*
@return
*/
public
String transInfixToPosfix(String in)
{
char
[] cin
=
in.toCharArray();
StringBuffer buffer
=
new
StringBuffer();
for
(
int
i
=
0
;i
<
cin.length;i
++
)
{
Item newItem
=
new
Item();
newItem.opPriority
=
1
;
newItem.ops
=
false
;
switch
(cin[i])
{
case
'
+
'
:
newItem.opPriority
=
1
;
newItem.ops
=
true
;
newItem.opVal
=
'
+
'
;
doOps(buffer, newItem);
break
;
case
'
-
'
:
newItem.opPriority
=
1
;
newItem.ops
=
true
;
newItem.opVal
=
'
-
'
;
doOps(buffer, newItem);
break
;
case
'
*
'
:
newItem.opPriority
=
2
;
newItem.ops
=
true
;
newItem.opVal
=
'
*
'
;
doOps(buffer, newItem);
break
;
case
'
/
'
:
newItem.opPriority
=
2
;
newItem.ops
=
true
;
newItem.opVal
=
'
/
'
;
doOps(buffer, newItem);
break
;
case
'
(
'
:
newItem.ops
=
true
;
newItem.opVal
=
'
(
'
;
opStack.push(newItem);
break
;
case
'
)
'
:
boolean
meetClose
=
false
;
while
(
!
opStack.isEmpty())
{
Item item
=
opStack.peek();
if
(item.ops
&&
item.opVal
!=
'
(
'
)
{
calcStack.add(item);
opStack.pop();
buffer.append(item.opVal);
}
else
if
(item.ops)
{
opStack.pop();
meetClose
=
true
;
break
;
}
}
if
(
!
meetClose)
{
throw
new
RuntimeException();
}
break
;
default
:
int
j
=
i;
for
(;j
<
cin.length
&&
cin[j]
>=
'
0
'
&&
cin[j]
<=
'
9
'
;j
++
);
if
(j
==
i)
{
throw
new
RuntimeException(
"
wrong input
.
"
);
}
newItem.ops
=
false
;
newItem.value
=
Integer.parseInt(
new
String(cin,i,j
-
i));
buffer.append(newItem.value);
calcStack.add(newItem);
i
=
j
-
1
;
break
;
}
}
while
(
!
opStack.isEmpty())
{
Item item
=
opStack.pop();
calcStack.add(item);
buffer.append(item.opVal);
}
return
buffer.toString();
}
private
void
doOps(StringBuffer buffer, Item newItem) {
while
(
!
opStack.isEmpty())
{
Item item
=
opStack.peek();
if
(item.opVal
!=
'
(
'
&&
item.opPriority
>=
newItem.opPriority)
{
calcStack.add(item);
opStack.pop();
buffer.append(item.opVal);
}
else
{
break
;
}
}
opStack.push(newItem);
}
/**
*
@param
args
*/
public
static
void
main(String[] args) {
Caculator calc
=
new
Caculator();
System.out.println(
"
1+2*3+7-(4/2+8)/5=
"
+
calc.transInfixToPosfix(
"
1+2*3+7-(4/2+8)/5
"
));
System.out.println(
"
value is:
"
+
calc.calc());
}
}
posted on 2007-10-09 22:48
DoubleH
阅读(216)
评论(1)
编辑
收藏
所属分类:
Memorandum
Feedback
#
re: 表达式求值Java粗糙版
2007-12-20 21:45
sitinspring
以后要多来看看.
回复
更多评论
IT新闻
新用户注册
刷新评论列表
标题
姓名
主页
验证码
*
内容(请不要发表任何与政治相关的内容)
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
相关文章:
有意思的“电灯泡问题”
伸展树与半伸展树Java实现
一种新的AVL平衡树删除操作的实现
使用赢者树的外部排序
图及其算法复习(Java实现) 三:最小支撑树(Prim,Kruskal算法)
图及其算法复习(Java实现) 二:拓扑排序,最短路径问题
图及其算法复习(Java实现) 一:存储结构,深度优先周游,广度优先周游
排序算法复习(Java实现)(二): 归并排序,堆排序,桶式排序,基数排序
排序算法复习(Java实现)(一): 插入,冒泡,选择,Shell,快速排序
树的非递归遍历 粗糙版
相关链接:
网站导航:
博客园
BlogJava
博客生活
IT博客网
C++博客
PHP博客
博客园社区
管理博客
教师博客
天文博客
汽车博客
足球博客
股票博客
电子博客
管理
Powered by:
BlogJava
Copyright © DoubleH