Пример. Написать программу, которая вычисляет как целое число значение выражений (без переменных), записаных (без ошибок) в постфиксной форме в текстовом файле. Каждая строка файла содержит ровно одно выражение.
Алгоритм решения. Выражение просматривается слева направо. Если встречается число, то его значение (как целое) заносится в стек, а если встечается знак операции, то из стека извлекаются два последних элемента (это операнды данной операции), над ними выполняется операция и ее результат записывается в стек. В конце в стеке остается только одно число — значение всего выражения.
{ Turbo Pascal, файл ST2.PAS } Program St2; Uses Spisok, Stack; Const Znak = ['+', '-', '*', '/']; Var S, S1 : String;
T : Text; I, N : Byte; X, Y : BT; Code : Integer; NS : U;
Begin Write('Введите имя файла: '); ReadLn(S1); Assign(T, S1); ReSet(T); NS := Nil; While Not Eof(T) Do
Begin ReadLn(T, S); I := 1; While I <= Length(S) Do Begin If S[I] In ['0'..'9'] Then Begin N := I; While S[I] In ['0'..'9'] Do I := I + 1; Val(Copy(S, N, I - N), X, Code); V_Stack(NS, X); End Else If S[I] In Znak Then Begin Iz_Stack(NS, X); Iz_Stack(NS, Y); Case S[I] Of '+' : X := X + Y; '-' : X := Y - X; '*' : X := X * Y; '/' : X := Y Div X End; V_Stack(NS, X) End; I := I + 1 End; Iz_Stack(NS, X); WriteLn(S, ' = ', X); End
End. /* C++, файл ST2.CPP */ #include «STACK.CPP» #include < string.h > #include < stdio.h > void main(void) { char S[255]; FILE *T; int I; BT X, Y; Zveno *NS; clrscr(); cout « «Введите имя файла: »; cin » S; T=fopen(S, «r»); NS = NULL; while (!feof(T)) {
fgets(S, 255, T); I = 0; while (I <= strlen(S)-1)
{
if (S[I]>='0'&&S[I]<='9') { X=0; while(S[I]>='0'&&S[I]<='9') {X=X*10+(S[I]-'0'); I++;} NS=V_Stack(NS, X); } else if (S[I]=='+'||S[I]=='-'||S[I]=='/'||S[I]=='*') { X=V_Vershine(NS); NS=Iz_Stack(NS); Y=V_Vershine(NS); NS=Iz_Stack(NS); switch (S[I]) { case '+' : X += Y; break; case '-' : X = Y - X; break; case '*' : X *= Y; break; case '/' : X = Y / X; break;} NS=V_Stack(NS, X); } I++;
} X=V_Vershine(NS); NS=Iz_Stack(NS); cout « S « » ⇒ » « X « «\n»;}
}