帮忙看一下这段算符优先算法的错误。 (50分)

  • 主题发起人 主题发起人 logpie
  • 开始时间 开始时间
L

logpie

Unregistered / Unconfirmed
GUEST, unregistred user!
这是我刚才写的:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
procedure FormCreate(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

type
Stk=Record
Data:array[1..50] of char;
top:0..50;
end;
type
TPTRTable=array[1..7,1..7] of char;
const
GT : TPTRTable= (
(* +, - * / ( ) # *)
(*+*) ( '>', '>', '<', '<', '<', '>', '>'),
(*-*) ( '>', '>', '<', '<', '<', '>', '>'),
(***) ( '>', '>', '>', '>', '<', '>', '>'),
(*/*) ( '>', '>', '>', '>', '<', '>', '>'),
(*(*) ( '<', '<', '<', '<', '<', '=', 'E'),
(*)*) ( '>', '>', '>', '>', 'E', '>', '>'),
(*#*) ( '<', '<', '<', '<', '<', 'E', '=')
);

var
Form1: TForm1;
OPTR,OPND:Stk;
StrExp,Thetas:String;
procedure Push(var Stack:stk;elem:Char);
function Pop(Var Stack:Stk):char;
function GetTop(Var Stack:Stk):Char;
function Confirm(ptr,ptr2:Char):Char;
function Operate(res,theta,res2:Char):PChar;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
theta,res,res2:Char;
res3:Pchar;
begin
Push(OPTR,'#');
Thetas:='+-*/()#';
StrExp:=Edit1.Text ;
i:=1;
while not((StrExp='#') and (GetTop(OPTR)='#'))do
begin
if StrExp in ['0'..'9'] then
begin
Push(OPND,StrExp);
i:=i+1;
end
else
case Confirm(GetTop(OPTR),StrExp) of
'<':begin
Push(OPTR,StrExp);
i:=i+1;
end;
'=':begin
Pop(OPTR);
i:=i+1;
end;
'E':Showmessage('Error');
'>':begin
theta:=Pop(OPTR);
res2:=Pop(OPND);
res:=Pop(OPND);
res3:=Operate(res,theta,res2);
Push(OPND,Char(res3));
end;
end;
end;
Showmessage(GetTop(OPND));
end;

procedure Push(Var Stack:stk;elem:Char);
begin
Stack.top:=Stack.top +1;
Stack.Data[Stack.top]:=elem;
end;

function Pop(Var Stack:Stk):char;
begin
Pop:=Stack.Data[Stack.top];
Stack.top:=Stack.top -1;
end;

function GetTop(Var Stack:Stk):Char;
begin
GetTop:=Stack.Data[Stack.top];
end;

function Confirm(Ptr,Ptr2:Char):Char;
var i,j:integer;
begin
i:=1;
j:=1;
while Ptr<>Thetasdo
i:=i+1;
while Ptr2<>Thetas[j]do
j:=j+1;
Confirm:= GT[i,j];
end;

function Operate(res,theta,res2:Char):PChar;
var temp:integer;
begin
case theta of
'+':temp:=Strtoint(res) + Strtoint(res2);
'-':temp:=Strtoint(res) - Strtoint(res2);
'*':temp:=Strtoint(res) * Strtoint(res2);
'/':temp:=Strtoint(res) div Strtoint(res2);
end;
Operate:=Pchar(inttostr(temp));
end;
end.

我的EDIT是2-1-758#
显示结果:2,也就是OPND栈顶的数是表达式的首字母,我是《数据结构》上面算法写的啊
到底错在哪了?
 
我看了你的程序,好像永远返回2
 
断点,调试是最好的方法了,你试试,应该就知道 的
 
返回的都是表达市首字符
比如:3-1#返回3~
郁闷
 
while not((StrExp='#')) and (GetTop(OPTR)='#')do
循环的条件问题。3-1#
3 : push
- : True and (3<>#)False = False ->showmessage(3)
 
糊涂了,糊涂了
因该是while not((StrExp='#') and (GetTop(OPTR)='#'))do

还是有问题SHOWMESSAGE出来的东西居然是OPTR栈里的运算符!诡异~
 
'>':begin
theta:=Pop(OPTR);
res2:=Pop(OPND);
res:=Pop(OPND);
res3:=Operate(res,theta,res2);
Push(OPND,Char(res3));//Push(OpND,res3[0])
end;
 
你这样又有什么意义呢?
不行的啊
 
char(res3)
res3是pchar是一指针
char(res3)相当于把指针这个数字转换成char,肯定有问题。
 
没有问题啊
 
且不管CHAR与INTEGER的问题
你把代码粘入DELPHI,直接将结果PUSH
设断点,OPND的栈顶元素确实是表达式首字符。
你调试的看看呀
 
其他的呢比如4-5# = -1
出来是-
 
晕了,是‘[’
 
出来的全是[
 
看来,这个算法的设计就是返回一位值。
 
我看晕了
 
哇这程序能用吗?
天......如果你是我的手下,早卡差了你
 
to delp:????????
你倒具体说说呀
 
to logpie
交出你的EBNF,一看你就是刚毕业的慢脑子堆栈
 
后退
顶部