高手入内!(100分)

  • 主题发起人 主题发起人 buptwqs
  • 开始时间 开始时间
B

buptwqs

Unregistered / Unconfirmed
GUEST, unregistred user!
如何转换表达式(类似TP中的表达式转换为逆波兰表达式)
要求$asdf$+($ghjk$+$loik$)
->$asdf$$ghjk$$loik$++
 
看看编译原理的书籍吧,使用堆栈的的方法就很简单实现。
 
编译原理讲的比较清楚
我记得数据结构堆栈一章也有类似例子
 
$...$中的内容为数据字段的值
数据量很大,不能使用堆栈。
 
自己编一个Char数组就可以解决这个问题,而且比较快
 
用二叉树的数据结构,(用中序遍历来存储一般表达式,在后序遍历它)
 
很简单的,用一个数组模拟栈就行了,如果不知道具体的算法,
说一下, 给你写一个。
 
具体说是用堆, 而不是栈. 相当于申请一块内存, 然后自己处理压入与
弹出. 一般情况下不会有无法处理的数据, 难道你会有一个几G长的表达式
吗?
 
知己键堆栈嘛
 
supermmx 请给我算法
 
数据结构中用二叉树来实现,前序,中序,后序之间的转换
 
好像不要树吧,建两个栈,一个操作符栈一个操作数栈,
定好操作符优先级,然后边读入自串边对栈进行操作。
具体见数据结构书籍(清华出的就有)
 
同意Cheka的做法,因为我曾经用此方法实现了一个的简单的编译器
 
呵呵,我记得上大一的时候,教pascal的老师就叫过我们这个办法
建两个栈,一个操作符栈,一个操作数栈.......
其实,在编译原理里讲这叫做算符优先文法...
 
这样:我还得想想,没机器没法测试,就只说算法了:
(你的先放下,我只说表达式, 简单的 a+b-c*d 等等)
用一个数组模拟栈, 0 是栈底, 变量 top 是栈顶元素的下标:
1,遇到字母,进栈,
2,遇到运算符,把栈中比它优先级高(字母优先级最低)的出栈,
3,遇到(,设一个标志,看作另一个栈,或者递归调用。
4,遇到),把栈中的元素全pop, 直到遇到(,
5,读完,全pop.
上面那个例子:
栈 输出
a
+ a
+b a
- ab+
-c ab+
-* ab+c
-*d ab+c
ab+cd*-
结束:
结果是 ab+cd*-,
当然这是简单的, 还有错误处理等等,你自己做吧。
 
错了,字母应该是后面运算符就 pop,
不行,没法测试,心里没底。
如果有错,请包涵。
 
好象字母不用进栈,直接打出来,
上面那个例子:
栈 输出

+ a
+ a
+ ab
- ab+
- ab+c
-* ab+c
-* ab+cd
ab+cd*-
结束:
 
数据量大没关系,大不了用 string 也可以模拟,(4G) 够不够?
回去写了个简单的,你可以照着改一下: 不难。
program Project1;
var
Input: string;

procedure Translate(s: string);
var
Stack: array of char;
i, Top: Integer;
temp: string;
begin
SetLength(Stack, Length(s));
i := 1;
Top := 0;
temp := '';
while i <= Length(s)do
begin
case s of
'a'..'z':
temp := temp + s;
'+', '-':
begin
while (Top > 0) and (Stack[Top - 1] <> '(')do
begin
temp := temp + Stack[Top - 1];
Dec(Top);
end;
Stack[Top] := s;
Inc(Top);
end;
'*', '/':
begin
if (Top > 0) and ((Stack[Top - 1] = '*') or (Stack[Top - 1] = '/'))
then
begin
temp := temp + Stack[Top - 1];
Dec(Top);
end;
Stack[Top] := s;
Inc(Top);
end;
'(':
begin
Stack[Top] := s;
Inc(Top);
end;
')':
begin
while (Stack[Top - 1] <> '(') and (Top > 0)do
begin
temp := temp + Stack[Top - 1];
Dec(Top);
end;
if Top = 0 then
begin
temp := '''('' expected!';
Top := 0;
Break;
end;
Dec(Top);
end;
end;
Inc(i);
end;
while (Top > 0)do
begin
if Stack[Top - 1] = '(' then
begin
temp := ''')'' expected1';
Break;
end;
Temp := Temp + Stack[Top - 1];
Dec(Top);
end;
writeln(temp);
end;

begin
writeln('Please input the expression:');
readln(Input);
Translate(Input);
readln;
end.
 
用数据结构的栈便可解决:
遇到字母,进栈,遇到运算符,把栈中比它优先级高(字母优先级最低)的出栈,遇到(,设一个标志,看作另一个栈,或者递归调用,遇到),把栈中的元素全pop, 直到遇到(,读完,全pop出。
You are too pigful!
 
自己模拟堆栈.
pop...push...
 

Similar threads

回复
0
查看
1K
不得闲
回复
0
查看
978
不得闲
D
回复
0
查看
825
DelphiTeacher的专栏
D
D
回复
0
查看
831
DelphiTeacher的专栏
D
后退
顶部