随笔:20 文章:1 评论:8 引用:0
╰⊙д⊙╯。oо○
面朝大海·春暖花开
BlogJava
首页
发新随笔
发新文章
联系
聚合
管理
『第四章』中缀表达式转换成后缀表达式
//
infix.java
//
converts infix arithmetic expressions to postfix
//
to run this program: C>java InfixApp
import
java.io.
*
;
//
for I/O
////////////////////////////////////////////////////////////////
class
StackX
{
private
int
maxSize;
private
char
[] stackArray;
private
int
top;
//
--------------------------------------------------------------
public
StackX(
int
s)
//
constructor
{
maxSize
=
s;
stackArray
=
new
char
[maxSize];
top
=
-
1
;
}
//
--------------------------------------------------------------
public
void
push(
char
j)
//
put item on top of stack
{ stackArray[
++
top]
=
j; }
//
--------------------------------------------------------------
public
char
pop()
//
take item from top of stack
{
return
stackArray[top
--
]; }
//
--------------------------------------------------------------
public
char
peek()
//
peek at top of stack
{
return
stackArray[top]; }
//
--------------------------------------------------------------
public
boolean
isEmpty()
//
true if stack is empty
{
return
(top
==
-
1
); }
//
-------------------------------------------------------------
public
int
size()
//
return size
{
return
top
+
1
; }
//
--------------------------------------------------------------
public
char
peekN(
int
n)
//
return item at index n
{
return
stackArray[n]; }
//
--------------------------------------------------------------
public
void
displayStack(String s)
{
System.out.print(s);
System.out.print(
"
Stack (bottom-->top):
"
);
for
(
int
j
=
0
; j
<
size(); j
++
)
{
System.out.print( peekN(j) );
System.out.print(
'
'
);
}
System.out.println(
""
);
}
//
--------------------------------------------------------------
}
//
end class StackX
////////////////////////////////////////////////////////////////
class
InToPost
//
infix to postfix conversion
{
private
StackX theStack;
private
String input;
private
String output
=
""
;
//
--------------------------------------------------------------
public
InToPost(String in)
//
constructor
{
input
=
in;
int
stackSize
=
input.length();
theStack
=
new
StackX(stackSize);
}
//
--------------------------------------------------------------
public
String doTrans()
//
do translation to postfix
{
for
(
int
j
=
0
; j
<
input.length(); j
++
)
//
for each char
{
char
ch
=
input.charAt(j);
//
get it
theStack.displayStack(
"
For
"
+
ch
+
"
"
);
//
*diagnostic*
switch
(ch)
{
case
'
+
'
:
//
it's + or -
case
'
-
'
:
gotOper(ch,
1
);
//
go pop operators
break
;
//
(precedence 1)
case
'
*
'
:
//
it's * or /
case
'
/
'
:
gotOper(ch,
2
);
//
go pop operators
break
;
//
(precedence 2)
case
'
(
'
:
//
it's a left paren
theStack.push(ch);
//
push it
break
;
case
'
)
'
:
//
it's a right paren
gotParen(ch);
//
go pop operators
break
;
default
:
//
must be an operand
output
=
output
+
ch;
//
write it to output
break
;
}
//
end switch
}
//
end for
while
(
!
theStack.isEmpty() )
//
pop remaining opers
{
theStack.displayStack(
"
While
"
);
//
*diagnostic*
output
=
output
+
theStack.pop();
//
write to output
}
theStack.displayStack(
"
End
"
);
//
*diagnostic*
return
output;
//
return postfix
}
//
end doTrans()
//
--------------------------------------------------------------
public
void
gotOper(
char
opThis,
int
prec1)
{
//
got operator from input
while
(
!
theStack.isEmpty() )
{
char
opTop
=
theStack.pop();
if
( opTop
==
'
(
'
)
//
if it's a '('
{
theStack.push(opTop);
//
restore '('
break
;
}
else
//
it's an operator
{
int
prec2;
//
precedence of new op
if
(opTop
==
'
+
'
||
opTop
==
'
-
'
)
//
find new op prec
prec2
=
1
;
else
prec2
=
2
;
if
(prec2
<
prec1)
//
if prec of new op less
{
//
than prec of old
theStack.push(opTop);
//
save newly-popped op
break
;
}
else
//
prec of new not less
output
=
output
+
opTop;
//
than prec of old
}
//
end else (it's an operator)
}
//
end while
theStack.push(opThis);
//
push new operator
}
//
end gotOp()
//
--------------------------------------------------------------
public
void
gotParen(
char
ch)
{
//
got right paren from input
while
(
!
theStack.isEmpty() )
{
char
chx
=
theStack.pop();
if
( chx
==
'
(
'
)
//
if popped '('
break
;
//
we're done
else
//
if popped operator
output
=
output
+
chx;
//
output it
}
//
end while
}
//
end popOps()
//
--------------------------------------------------------------
}
//
end class InToPost
////////////////////////////////////////////////////////////////
class
InfixApp
{
public
static
void
main(String[] args)
throws
IOException
{
String input, output;
while
(
true
)
{
System.out.print(
"
Enter infix:
"
);
System.out.flush();
input
=
getString();
//
read a string from kbd
if
( input.equals(
""
) )
//
quit if [Enter]
break
;
//
make a translator
InToPost theTrans
=
new
InToPost(input);
output
=
theTrans.doTrans();
//
do the translation
System.out.println(
"
Postfix is
"
+
output
+
'
\n
'
);
}
//
end while
}
//
end main()
//
--------------------------------------------------------------
public
static
String getString()
throws
IOException
{
InputStreamReader isr
=
new
InputStreamReader(System.in);
BufferedReader br
=
new
BufferedReader(isr);
String s
=
br.readLine();
return
s;
}
//
--------------------------------------------------------------
}
//
end class InfixApp
////////////////////////////////////////////////////////////////
发表于 2008-04-26 11:38
dreamingnest
阅读(465)
评论(0)
编辑
收藏
所属分类:
链表和栈(结)
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
Chat2DB
C++博客
博问
管理
相关文章:
『第四章』后缀表达式求值
『第四章』中缀表达式转换成后缀表达式
『第四章』优先级队列
『第四章』队列的基本使用
『第四章』栈的使用
『第三章』几种排序的关键代码
『第二章』二分查找
CALENDER
<
2008年4月
>
日
一
二
三
四
五
六
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
常用链接
我的随笔
我的文章
我的评论
我的参与
最新评论
留言簿
(1)
给我留言
查看公开留言
查看私人留言
随笔分类
(13)
应用程序(4)
(rss)
数据结构(java)
(rss)
算法程序总结(2)
(rss)
链表和栈(结)(7)
(rss)
随笔档案
(21)
2008年10月 (1)
2008年5月 (7)
2008年4月 (13)
外面的世界
懒散狂徒的专栏(天行健,君子以自强不息 地势坤,君子以厚德载物)
(rss)
这里的朋友
保尔任(思想比知识更重要 成长比成功更重要)
搜索
最新评论
1. re: BFS和DFS两种方法获取指定目录下的所有目录和文件
学习了
--fejay
2. re: 关于蚂蚁问题(Ants)
实际过程可以这么进行抽象模拟:
序列中的元素带有方向,进行负值部分移动到负值区域,正值部分移动到正值区域时就不再发生碰撞,此时绝对值最小的值决定剩余爬行时间
--zdh
3. re: 关于蚂蚁问题(Ants)
这个问题看到实质就很简单,所有的蚂蚁都是相同的蚂蚁,因此可以看成所有的蚂蚁都可以穿过对面爬过来的蚂蚁就ok啦,最长时间就是两端的蚂蚁向另一端爬出去,最短的就是两端的四个蚂蚁向所在端爬出:)
--zdh
4. re: 关于蚂蚁问题(Ants)
评论内容较长,点击标题查看
--blues
5. re: 关于蚂蚁问题(Ants)
评论内容较长,点击标题查看
--dreamingnest
阅读排行榜
1. 关于蚂蚁问题(Ants)(2218)
2. 通过排序总结java泛型数组列表(1643)
3. 堆栈解(非递归)决迷宫问题(1409)
4. ACM中使用JAVA的介绍(1046)
5. ~·扫雷小游戏·~(1027)
评论排行榜
1. 关于蚂蚁问题(Ants)(7)
2. BFS和DFS两种方法获取指定目录下的所有目录和文件(1)
3. 一著名软件公司的java笔试算法题的答案 (0)
4. 堆栈解(非递归)决迷宫问题(0)
5. 堆排序代码(0)
Powered By:
博客园
模板提供
:
沪江博客