IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Задача на Обратную Польскую Нотацию (постфикс), Задача на Обратную Польскую Нотацию (пос
PanTILImon
сообщение 23.11.2005 12:30
Сообщение #1


Гость






Программеры, решите пожалуйста задачку.

Дана string и в ней записано мат. выражение в постфиксной форме. Нужно подсчитать резутьтат. (используются знаки +, -, /, * (, ), и только целые числа)

Заранее СПАСИБА...
 К началу страницы 
+ Ответить 
volvo
сообщение 23.11.2005 12:41
Сообщение #2


Гость






PanTILImon, я не понял, поиском воспользоваться тебе религия не позволяет?
FAQ: Постфиксная форма записи
 К началу страницы 
+ Ответить 
Guest
сообщение 23.11.2005 13:00
Сообщение #3


Гость






Volvo, я ваще нуб в паскале. Мне в универе задачу дали, а зафтра сдавать нада уже, а то зачОт не паставят.

Я по той ссылке, которую ты мне дал ваще ничего не панимаю.
И мне переводить из объчной формы нинада, т.к. в строке дана сразу постфиксная.

И можно без стека или нет???

Помоги пожалуйста решить...
 К началу страницы 
+ Ответить 
Atos
сообщение 23.11.2005 13:07
Сообщение #4


Прогрессор
****

Группа: Модераторы
Сообщений: 602
Пол: Мужской
Реальное имя: Михаил

Репутация: -  9  +


Цитата
Мне в универе задачу дали, а зафтра сдавать нада уже,
Что-то сомнительно. Такие задачи на один день не даются. Что же ты полсеместра делал?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 23.11.2005 13:08
Сообщение #5


Гость






Цитата
И можно без стека или нет???

Без стека - однозначно нельзя... На использовании стека и основан алгоритм... Если не надо переводить в постфикс, то придется чуть-чуть поменять программу... Сейчас посмотрю, что именно там нужно сделать...
 К началу страницы 
+ Ответить 
volvo
сообщение 23.11.2005 13:33
Сообщение #6


Гость






Стоп, стоп... Я только сейчас сообразил... Ты это о чем?
Цитата
(используются знаки +, -, /, * (, ), и только целые числа)

? blink.gif Скобки в постфиксе? Тогда зачем мне такой постфикс нужен, спрашивается, если придется еще раз учитывать приоритет вычислений? НЕ БЫВАЕТ скобок в постфиксной записи !!!

Уточни задание...
 К началу страницы 
+ Ответить 
panTILImon
сообщение 23.11.2005 14:15
Сообщение #7


Гость






volvo, я блин описался/
Нет канечна скобок никаких.
ТОКА: *, /, +, -, целые числа.
 К началу страницы 
+ Ответить 
panTILImon
сообщение 23.11.2005 16:45
Сообщение #8


Гость






volvo, реши плиз, Ты же мозг!!! А то мне зафтра сдавать нада...(((
 К началу страницы 
+ Ответить 
volvo
сообщение 23.11.2005 16:54
Сообщение #9


Гость






Ну что, неужели не можешь сам догадаться, что надо изменить?
Вот так:
type
TokenType =
(tkOpen,
tkPlus, tkMinus,
tkMult, tkDiv,
tkClose,
tkNumber );


type
{ Хоть тебе и нужны только целые, но при делении будет вещественное }
TType = Real;

PTItem = ^TItem;
TStack = PTItem;
TItem =
record
info: TType;
next: PTItem;
end;

procedure initStack(var s: TStack);
begin
s := nil
end;

function isEmpty(var s: TStack): boolean;
begin
isEmpty := (s = nil)
end;

procedure pushStack(var s: TStack; T: TType);
var
nItem: PTItem;
begin
new(nItem);
nItem^.next := s;
nItem^.info := T;
s := nItem;
end;

function topStack(var s: TStack): TType;
begin
topStack := s^.info
end;

function popStack(var s: TStack): TType;
var ToDelete: PTItem;
begin
if not isEmpty(s) then
begin
ToDelete := s;
s := s^.next;
popStack := ToDelete^.info;
dispose(ToDelete)
end;
end;


function getNextToken(var s, sT: string): TokenType;
begin
While s[1] = ' ' Do Delete(s, 1, 1);
case s[1] of
'(', ')':
begin
case s[1] of
'(': getNextToken := tkOpen;
')': getNextToken := tkClose;
end;
st := ''; delete(s, 1, 1)
end;
'-', '+', '*', '/':
begin
case s[1] of
'+': getNextToken := tkPlus;
'-': getNextToken := tkMinus;
'*': getNextToken := tkMult;
'/': getNextToken := tkDiv;
end;
st := s[1]; delete(s, 1, 1);
end
else
begin
st := '';
while (s <> '') and (s[1] in ['0'..'9', '.']) do
begin
st := st + s[1];
delete(s, 1, 1);
end;
getNextToken := tkNumber
end;
end
end;

const
s: string = '2 3 + 4 * 5 +';
var
sToken: string;
nextToken, from: TokenType;
sres: string;
myStack: TStack;

T: TType;
ErrCode: Integer;


begin
initStack(myStack);

while s <> '' do
begin
nextToken := getNextToken(s, sToken);
case nextToken of
tkNumber:
Begin
Val(sToken, T, ErrCode);
pushStack(myStack, T);
End;
tkPlus:
Begin
T := PopStack(myStack);
PushStack(myStack, PopStack(myStack)+T)
End;
tkMinus:
Begin
T := PopStack(myStack);
PushStack(myStack, PopStack(myStack)-T)
End;
tkDiv:
Begin
T := PopStack(myStack);
PushStack(myStack, PopStack(myStack)/T)
End;
tkMult:
Begin
T := PopStack(myStack);
PushStack(myStack, PopStack(myStack)*T)
End;
end
end;

Writeln(PopStack(myStack):10:5);
end.
 К началу страницы 
+ Ответить 
panTILImon
сообщение 23.11.2005 16:59
Сообщение #10


Гость






Спасиба БАЛЬШОЕ!!!!!!
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 18.06.2025 6:27
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"