Форум программистов, компьютерный форум CyberForum.ru

Из инфиксной в постфиксную - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Как от текущей даты отнять 20 лет http://www.cyberforum.ru/cpp-beginners/thread688906.html
Надо от текущей даты отнять 20 лет... Помогите плиз!
C++ Динамическое выделение памяти Первый раз столкнулся с такой задачей... Дали лабораторную работу: Разработать приложения, реализующее следующие функции: 1) Выделяет всю доступную процессу память. 2)Освобождает всю выделенную память. 3)Определяет колличество выделенной памяти. 4)Определяет время выделения память. 5)Определяет время освобождения памяти. Память необходимо выделять функциями HeapAlloc и mallok блоками по... http://www.cyberforum.ru/cpp-beginners/thread688905.html
Как работать с настройками win7 ? C++
Как получить доступ к настройкам win7 таким как "показывать/не показывать скрытые файлы" и изменять их?
Для битового массива C++
Добрый день, форумчане! Подскажите, как можно реализовать данные функции : 1)реализовать процедуру установки значения бита, заданного по индексу, в 0. 2)реализовать процедуру установки значения бита, заданного по индексу, в 1. 3)процедура заполнения битового массива произвольными последовательностями нулевых и единичных битов. 4)Реализовать процедуру вывода битового массива в поток: все...
C++ Радиокнопки http://www.cyberforum.ru/cpp-beginners/thread688871.html
Помогите пожалуйста сделать радио кнопки! # include <iostream.h> # include <stdio.h> void main() { int a; cout <<"Program\n" <<"1. Kuhna\n"
C++ Слияние нескольких исполняемых файлов Программа выполняет слияние бинарных файлов, указанных в командной строке в выходной, отличный от входных. Формат командной строки join.exe <inputfile>...<inputfile N> <output> Получилась следующая программа: #include <stdio.h> int main(int argc, char* argv) подробнее

Показать сообщение отдельно
sanchoflat
4 / 6 / 1
Регистрация: 05.11.2011
Сообщений: 97

Из инфиксной в постфиксную - C++

05.11.2012, 11:48. Просмотров 807. Ответов 2
Метки (Все метки)

Привет, опять я с этим заданием. Уже глаз болит, не могу понять в чем беда. Проблема при использовании скобок. А если вводить что-то типа A+B-C то он теряет "-"
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
bool stekNil( Stack^ stek, bool *flag,wchar_t q)//проверка на пустоту списка
        {
            *flag = false;
            if ( stek->Count == 0 )
                {
                    *flag = true;
                }
            else *flag = false;
            return *flag;
        }
 
///////////////////////
 
        int prior(wchar_t q, int *prioritet)// приоритет подавайемый на вход
        {
            if ( q == '-' ||q =='+' ) *prioritet= 1;
            else if ( q == '*' || q == '/' ) *prioritet = 2;
            else if ( q == '^' ) *prioritet = 3;
            return *prioritet;
        }
        ///////////////////////////работает
 
        bool proritetStek(int *prior,int *pr, Stack^ stek, bool *flag )
        {           
 
            *flag = false;
            *pr = 0; //приоритет элемента в стеке
            do
                {
                    if ( Convert::ToChar(stek->Peek()) == Convert::ToChar('(')) *pr = 0;
                    if ( Convert::ToChar(stek->Peek()) == Convert::ToChar('-') || Convert::ToChar(stek->Peek()) == '+' )*pr = 1;
                    if (Convert::ToChar(stek->Peek()) == Convert::ToChar('*') || Convert::ToChar(stek->Peek()) == Convert::ToChar('/')) *pr = 2;
                    if (Convert::ToChar(stek->Peek()) == Convert::ToChar('^') ) *pr = 3;
                    if ( *pr<*prior ) // если приоритет в стеке меньше чем на входе
                        *flag = true;
                    else *flag = false;
                    stek->Pop();
                }
                while ( stek->Count != 0);
                return *flag;   
        }
 
/////////////////////////
 
        void verxnielem (int *prior,Stack^ stek,int *pr,Stack^ out )
        {
            *pr=0; // приоритет в стеке
            bool flag1 = false;
            
            while ( stek->Count != 0)
            {
                    flag1 = false;
                    if (Convert::ToChar(stek->Peek()) == Convert::ToChar('-') || Convert::ToChar(stek->Peek()) == Convert::ToChar('+'))*pr = 1;
                    if (Convert::ToChar(stek->Peek()) == Convert::ToChar('*') || Convert::ToChar(stek->Peek()) == Convert::ToChar('/')) *pr = 2;
                    if (Convert::ToChar(stek->Peek()) == '^' ) *pr = 3;
                    
                    if ( *pr>=*prior) //приоритет на вершине стека больше или равен приоритета на входе
                    {
                        flag1 = true;
                        out->Push(stek->Peek());
                        stek->Pop();
                    }
                }
 
        }
 
        ///////////////////////////////////////////////////////
 
        void sakrskobka(Stack^ stek,Stack^ out)
        {
            while ( stek->Peek() != '(' )
                {
                    out->Push(stek->Peek());
                    stek->Pop();
                }
            if ( stek->Peek()== '(' || stek->Peek()== ')')
                stek->Pop();
        }
 
        void peregon(Stack^ out)
        {
            String ^outstr;
            String ^q;
            Stack^ vrem = gcnew Stack;
            while ( out->Count != 0 )
                {
                    vrem->Push(out->Peek());
                    out->Pop();
 
                }
            while ( vrem->Count != 0 )
            {
                    q = Convert::ToString(vrem->Peek());
 
                    outstr = String::Concat(outstr,q);
                    vrem->Pop();
            }
            label5->Text = outstr;      
        }
И сам алгоритм
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
                 int i=0;
                 for (  i=0; i<n; i++)
                    {
                        if ( in[i]>='A' && in[i]<='Z' )
                            {
                                out->Push(Convert::ToString(in[i]));
                            }
                        ///////////////////////////////////////////////
                        else if ( in[i]=='-' || in[i]=='+' || in[i]=='/' || in[i]=='*' || in[i]=='^' )
                            {
                                q=in[i];
                                prior( q, &prioritet); //проверяем приоритет на входе
                                stekNil(stek,&flag,q); // проверяем пустоту стека
                                if ( flag == true ) // если пустой - помещаем элемент в стек
                                    {   
                                        stek->Push(in[i]);
                                    }
 
 
                                else // если стек полон, проверяем приоритет элементов в стеке. Если приоритет в стеке меньше чем на входе - помещаем в стек
 
                                    if ( proritetStek(&prioritet,&pr,gcnew Stack(stek),&flag )==true)
                                    {
                                         stek->Push(in[i]);
                                    }
                                 
                                    else  // иначе если приоритет элемента в стеке больше или равен приоритета на входе - вытаскиваем эл. из стека в выходной стек
 
                                    verxnielem (&prioritet,gcnew Stack(stek),&pr,out);
 
                            }
 
 
                        if ( in[i] == '(') // если открывающаяся скобка - помещаем в стек
                            {
                                stek->Push(in[i]);
                            }
                        
                        if ( in[i] == ')') // если закрывающаяся скобка - вытаскиваем элементы из стека в выходной стек, пока не встретим откр. скобку.
                            {
                                sakrskobka(gcnew Stack(stek),out);
                            }
                 }
 
                 if ( i == n ) // если элемент в строке последний, то вытаскиваем элементы из стека в выходной
                    {
                        MessageBox::Show(Convert::ToString(stek->Count));
                        flag = true;
                        while ( flag)
                            {
                                out->Push(stek->Peek());
                                stek->Pop();
                                if ( stek->Count == 0)
                                    flag = true;
                                else flag = false;
                            }
                    }
 
                 MessageBox::Show(Convert::ToString(stek->Peek()));
                 peregon(out);// перегон из выходного стека в строку и вывод в label
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 05:01. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru