Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.10.2012, 23:06   #1
sanchoflat
Пользователь
 
Регистрация: 31.10.2011
Сообщений: 23
По умолчанию перевод выражения из инфиксной записи в постфиксную

Привет, никак не получается наладить алгоритм перевода из инфискной записи в постфиксную.
Делаю по алгоритму:
1. раскидываем знаки и операнды в разные стеки. если в выражении встречаем ')'
то отыскиваем в стеке соответствущую левую скобку и все что выше '(' выталкиваем в стек с операндами.
2. Дальше проходим по выражению и если мы встречаем операнд, который по приоритету меньше чем верхний элемент стека или не является '(' то выталкиваем элементы из стека со знаками в стек с операндами, пока не встретим '(' или дно стека.
Не очень могу понять как реализовать часть 2.
и код:
PHP код:
void algoritm(int n, array <wchar_t> ^out)
        {
            
optype type;
            
bool flag false;
            array <
wchar_t> ^mas;
            
StackmyStackX gcnew Stack;
            
StackmyStackY gcnew Stack;
            
int j 0;
            
int q;
                for (
int i 0<ni++)
                    {
                        if ( 
out[i] >='A' && out[i]<='Z')
                            {
                                
myStackX->Push(out[i]);
                            }
                        else if ( 
out[i] =='+' || out[i] =='-' || out[i] =='*' || out[i] =='/' || out[i] == '^' || out[i] == '(')
                            {
                                if (
flag == true)
                                {
                                    if(
myStackY->Peek()=='*')  type multiply;
                                    if(
myStackY->Peek()=='/')  type devide;
                                    if(
myStackY->Peek()=='+')  type plus;
                                    if(
myStackY->Peek()=='-')  type minus;
                                    if(
myStackY->Peek()=='^')  type power;

                                    if(
out[i+1]=='*')  multiply;
                                    if(
out[i+1]=='/')  devide;
                                    if(
out[i+1]=='+')  plus;
                                    if(
out[i+1]=='-')  minus;
                                    if(
out[i+1]=='^')  power;

                                    if (
q>type || out[i+1] == '(')
                                        {
                                            
myStackY->Push(out[i+1]);
                                        }
                                    else
                                        {
                                            do 
                                                {
                                                    
myStackX->Push(myStackY->Peek());
                                                    
myStackY->Pop();    
                                                }
                                            while (
out[i+1]!='('
                                
}
                                else
                                
myStackY->Push(out[i]);    
                            
//MessageBox::Show(Convert::ToString(myStackY->Peek()));
                            
}
                            
                        else if ( 
out[i] == ')' || )
                            {
                                do
                                {
                                        if ( 
Convert::ToChar(myStackY->Peek()) == '(')
                                            {
                                                
myStackY->Pop();
                                                break;
                                            }
                                        else
                                            
//{
                                                
myStackX->Push(myStackY->Peek());
                                                
myStackY->Pop();    
                                        
//}
                                
}
                                while ( 
Convert::ToChar(myStackY->Peek()) != '(' );
                                
myStackY->Pop();
                                
flag true;
                            }
                    
//    MessageBox::Show(Convert::ToString(myStackY->Peek()));
                    
}
        
MessageBox::Show(Convert::ToString(myStackY->Peek()));
        } 
sanchoflat вне форума Ответить с цитированием
Старый 26.10.2012, 23:10   #2
Helloween
Форумчанин
 
Регистрация: 24.04.2012
Сообщений: 300
По умолчанию

Ужс, адская смесь .NET и c++.
Помог? Оставляем отзыв =)
Helloween вне форума Ответить с цитированием
Старый 26.10.2012, 23:13   #3
sanchoflat
Пользователь
 
Регистрация: 31.10.2011
Сообщений: 23
По умолчанию

Пишу в VS, формы
sanchoflat вне форума Ответить с цитированием
Старый 26.10.2012, 23:21   #4
sanchoflat
Пользователь
 
Регистрация: 31.10.2011
Сообщений: 23
По умолчанию

В принципе проблема самая большая с составлением алгоритма, как что за чем писать. После выполнения пункта 2 небольшая проблемка
sanchoflat вне форума Ответить с цитированием
Старый 26.10.2012, 23:32   #5
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Сообщение от sanchoflat Посмотреть сообщение
В принципе проблема самая большая с составлением алгоритма, как что за чем писать. После выполнения пункта 2 небольшая проблемка
Первый совет: вначале записать словами алгоритм, потом его превратить в комментарии и к этим комментариям писать код; второй совет: не допускать при этом слишком крупных методов.

Третий совет: обратить внимание, что всё содержимое скобок превращается в один операнд выходной строки. То есть, пусть у нас уже есть код, который превращает в постфиксную запись выражение без скобок. Тогда его можно модифицировать следующим образом: как только ему попалась закрывающая скобка, он завершается, возвращая созданную к этому времени строку; как только вместо операнда ему попалась открывающая скобка, он вызывает сам себя для следующего после скобки символа, и возвращённое этим вызовом (это получится содержимое пары скобок в постфиксной записи) использует в качестве операнда.
Abstraction вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Преобразование арифметического выражения из инфиксной в постфиксную форму записи Nelson1992 Паскаль, Turbo Pascal, PascalABC.NET 2 29.05.2021 18:04
Перевод выражения из инфиксной в постфиксную форму branbranzor Помощь студентам 1 18.06.2012 00:04
Перевод из инфиксной записи в обратную польскую Anny_Apple Паскаль, Turbo Pascal, PascalABC.NET 1 10.04.2011 20:49
программа для перевода из инфиксной формы записи в постфиксную Diana888 Помощь студентам 0 01.10.2009 23:15
программа для перевода из инфиксной формы записи в постфиксную Diana888 Общие вопросы C/C++ 0 01.10.2009 23:06