E81086713E446D36F62B2AA2A3502B5EB155
Java杂家
杂七杂八。。。一家之言
BlogJava
首页
新随笔
联系
聚合
管理
141 Posts :: 1 Stories :: 174 Comments :: 0 Trackbacks
公告
所有文章和代码除非特别说明, 均为本blog作者原创,转载请注明出处和原作者. 谢谢!
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(15)
给我留言
查看公开留言
查看私人留言
随笔分类
Memorandum (17)
随笔档案
2011年12月 (1)
2011年2月 (1)
2009年12月 (1)
2009年11月 (1)
2009年5月 (1)
2009年4月 (2)
2009年1月 (2)
2008年12月 (1)
2008年6月 (3)
2008年5月 (1)
2008年3月 (2)
2008年2月 (1)
2007年12月 (9)
2007年10月 (2)
2007年9月 (1)
2007年7月 (2)
2007年5月 (2)
2007年4月 (1)
2007年3月 (2)
2007年2月 (1)
2007年1月 (4)
相册
code
搜索
积分与排名
积分 - 184389
排名 - 311
最新评论
1. re: 运行时注入你的Java代码到一个已经在运行的Java程序
wroker.dll 和 vmattach.dll有源码吗?求分享
--ww
2. re: 向上取整的一个应用
当N等于0的时候貌似不成立
--上海码农
3. re: 红黑树的Java实现
怎么找到这个DefaultBSTree和BSTree啊?@new
--super fly
4. re: 红黑树的Java实现
想问一下,这个是完整,直接能用的代码吗???好像是不怎么行耶?
--super fly
5. re: 红黑树的Java实现
评论内容较长,点击标题查看
--new
阅读排行榜
1. 排序算法复习(Java实现)(一): 插入,冒泡,选择,Shell,快速排序(36694)
2. 排序算法复习(Java实现)(二): 归并排序,堆排序,桶式排序,基数排序(15401)
3. 红黑树的Java实现(8488)
4. WebLogic中拦截全局http请求(7939)
5. 重写BASE64Encoder(6580)
评论排行榜
1. Java转EXE文件工具(23)
2. 红黑树的Java实现(20)
3. 排序算法复习(Java实现)(一): 插入,冒泡,选择,Shell,快速排序(15)
4. 排序算法复习(Java实现)(二): 归并排序,堆排序,桶式排序,基数排序(11)
5. Java2EXE Builder 1.0.0(9)
表达式求值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
阅读(990)
评论(1)
编辑
收藏
所属分类:
Memorandum
Feedback
#
re: 表达式求值Java粗糙版
2007-12-20 21:45
sitinspring
以后要多来看看.
回复
更多评论
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
知识库
C++博客
博问
管理
相关文章:
求连续正整数使得其和为给定的一个正整数的构造性解法
向上取整的一个应用
《算法概论》第一章习题35证明(Wilson定理)
有意思的“电灯泡问题”
伸展树与半伸展树Java实现
一种新的AVL平衡树删除操作的实现
使用赢者树的外部排序
图及其算法复习(Java实现) 三:最小支撑树(Prim,Kruskal算法)
图及其算法复习(Java实现) 二:拓扑排序,最短路径问题
图及其算法复习(Java实现) 一:存储结构,深度优先周游,广度优先周游
Powered by:
BlogJava
Copyright © DoubleH