主题:关于队列的一道题。大哥们帮帮忙!
广义线性表:线性表的一种推广。如果允许构成线性表的元素本身又可以是线性表的话,则该线性表称为广义线性表。
设有一个表L={a1,a2,a3,…,an},其中L为表名,ai为表元素(1≤i≤n).当ai为数值时,表示为元素;当ai为大写字母时,表示另一个表,但不能循环定义。例如下面的定义是合法的(约定L是第一个表的表名):
L=(3,4,3,4,K,8,0,8,P)
K=(5,5,8,9,9,4)
P=(4,7,8,9)
程序要求:当全部表给出后,求出所有元素的最大元素。例如上例的最大元素为9,表中全部元素和为 98
输入数据:输入全部表,每行一个表。
输出数据:最大元素和全部元素和。
以下是程序,我没看懂,请帮帮忙(尤其是从主程序的第二个WHILE循环开始):
Program GuangYiBiao_11;
CONST Lmax=100;
TYPE
tabTYPE=RECORD
length:0..Lmax;
element:array[1..Lmax] of char;
END;
qtype=RECORD
base:array[0..Lmax] of char;
front,rear:0..Lmax;
END;
VAR
t:array['A'..'Z'] of tabtype;
q:qtype;
ch:char;
s:string;
i:integer;
PROCEDURE inqueue(VAR q:qtype; c:char);
BEGIN
q.rear:=q.rear+1;
q.base[q.rear]:=c;
END;{inqueue}
FUNCTION outqueue(VAR q:qtype):char;
BEGIN
q.front:=q.front+1;
outqueue:=q.base[q.front];
END;{outqueue}
FUNCTION maxnumber(c:char):char;
VAR
ch,m,max:char;
i:integer;
BEGIN
max:='0';
FOR i:=1 to t[c].length DO
BEGIN
ch:=t[c].element[i];
IF ch in ['A'..'Z'] THEN m:=maxnumber(ch)
ELSE m:=ch;
IF max<m THEN max:=m;
END;
maxnumber:=max;
END;{maxnumber}
FUNCTION total(c:char):integer;
VAR
k,i,m:integer;
ch:char;
BEGIN
k:=0;
FOR i:=1 to t[c].length DO
BEGIN
ch:=t[c].element[i];
IF (ch in ['A'..'Z']) THEN m:=total(ch)
ELSE m:=ord(ch)-ord('0');
k:=k+m
END;
total:=k;
END;{total}
BEGIN{main}
FOR ch:='A' to 'Z' DO t[ch].length:=0;
q.front:=0;
q.rear:=0;
inqueue(q,'L');
WHILE q.front<>q.rear DO
BEGIN
ch:=outqueue(q);
write(ch,'=');
readln(s);
i:=1;
WHILE s[i]<>'(' DO i:=i+1;
WHILE s[i]<>')' DO
BEGIN
s[i]:=upCASE(s[i]);
IF s[i] in ['A'..'Z','0'..'9'] THEN
BEGIN
inc(t[ch].length);
t[ch].element[t[ch].length]:=s[i];
IF s[i] in ['A'..'Z'] THEN inqueue(q,s[i]);
END;{then}
inc(i);
END;{while}
END;{while}
Writeln('total is:',total('L'));
Writeln('max is:',maxnumber('L'));
END.{main}
注意:在输入数据时要输入形如下表的数据:
表(4,5,K,p,w,9,8)要写成(45Kpw98) 不分大小写
设有一个表L={a1,a2,a3,…,an},其中L为表名,ai为表元素(1≤i≤n).当ai为数值时,表示为元素;当ai为大写字母时,表示另一个表,但不能循环定义。例如下面的定义是合法的(约定L是第一个表的表名):
L=(3,4,3,4,K,8,0,8,P)
K=(5,5,8,9,9,4)
P=(4,7,8,9)
程序要求:当全部表给出后,求出所有元素的最大元素。例如上例的最大元素为9,表中全部元素和为 98
输入数据:输入全部表,每行一个表。
输出数据:最大元素和全部元素和。
以下是程序,我没看懂,请帮帮忙(尤其是从主程序的第二个WHILE循环开始):
Program GuangYiBiao_11;
CONST Lmax=100;
TYPE
tabTYPE=RECORD
length:0..Lmax;
element:array[1..Lmax] of char;
END;
qtype=RECORD
base:array[0..Lmax] of char;
front,rear:0..Lmax;
END;
VAR
t:array['A'..'Z'] of tabtype;
q:qtype;
ch:char;
s:string;
i:integer;
PROCEDURE inqueue(VAR q:qtype; c:char);
BEGIN
q.rear:=q.rear+1;
q.base[q.rear]:=c;
END;{inqueue}
FUNCTION outqueue(VAR q:qtype):char;
BEGIN
q.front:=q.front+1;
outqueue:=q.base[q.front];
END;{outqueue}
FUNCTION maxnumber(c:char):char;
VAR
ch,m,max:char;
i:integer;
BEGIN
max:='0';
FOR i:=1 to t[c].length DO
BEGIN
ch:=t[c].element[i];
IF ch in ['A'..'Z'] THEN m:=maxnumber(ch)
ELSE m:=ch;
IF max<m THEN max:=m;
END;
maxnumber:=max;
END;{maxnumber}
FUNCTION total(c:char):integer;
VAR
k,i,m:integer;
ch:char;
BEGIN
k:=0;
FOR i:=1 to t[c].length DO
BEGIN
ch:=t[c].element[i];
IF (ch in ['A'..'Z']) THEN m:=total(ch)
ELSE m:=ord(ch)-ord('0');
k:=k+m
END;
total:=k;
END;{total}
BEGIN{main}
FOR ch:='A' to 'Z' DO t[ch].length:=0;
q.front:=0;
q.rear:=0;
inqueue(q,'L');
WHILE q.front<>q.rear DO
BEGIN
ch:=outqueue(q);
write(ch,'=');
readln(s);
i:=1;
WHILE s[i]<>'(' DO i:=i+1;
WHILE s[i]<>')' DO
BEGIN
s[i]:=upCASE(s[i]);
IF s[i] in ['A'..'Z','0'..'9'] THEN
BEGIN
inc(t[ch].length);
t[ch].element[t[ch].length]:=s[i];
IF s[i] in ['A'..'Z'] THEN inqueue(q,s[i]);
END;{then}
inc(i);
END;{while}
END;{while}
Writeln('total is:',total('L'));
Writeln('max is:',maxnumber('L'));
END.{main}
注意:在输入数据时要输入形如下表的数据:
表(4,5,K,p,w,9,8)要写成(45Kpw98) 不分大小写