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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Отс1993
2 / 2 / 1
Регистрация: 23.04.2012
Сообщений: 15
#1

Обратная польская нотация - C++

23.04.2012, 17:35. Просмотров 1208. Ответов 0
Метки нет (Все метки)

требуется написать калькулятор через ОПН....долго писал на Dev 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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include <cstdlib>
#include <iostream>
#include <cstdio>
#include <string>
 
using namespace std;
struct node;
typedef node *ref;
struct node {
       ref next;
       char el;
       };
typedef ref LIFO;
void initstack (LIFO &top);
void putstack (LIFO &top, char last);
void outstack (LIFO &top, char first);
bool checkstack (LIFO top);
int main(int argc, char *argv[])
{
    char a[50],b[50];char s;
    cout<<"Введите выражение: ";
    gets(a);
    LIFO stack,top;
    initstack(stack); 
    int n=strlen(a),i=0,k=0;
    while (i<n)
{
     if (a[i]>='0'&& a[i]<='9')
      {b[k]=a[i];
       k++;}
       else if (a[i]=='(')
             putstack (stack,a[i]);
       else if (a[i]==')')
        while (s!='(')
        {
          outstack(stack,s);
           if (s!='(')
           {b[k]=s;k++;}
          
          }
          
          else if ((a[i]=='-')||(a[i]=='+'))
            if ((checkstack(stack)==false)||((*stack).el=='('))
                putstack(stack,a[i]);
                        else
                        {
                        while ((stack->el!='(')||(stack->el=='+')||(stack->el=='-')||(stack->el!='*')||(stack->el!='/')||(stack->el!='^'))
                             {outstack(stack,s);
                             b[k]=s;
                             k++;}
                         if (stack->el=='(')
                             outstack (stack,s);
                           putstack(stack,a[i]);    
                              }
              else if ((a[i]=='*')||(a[i]=='/'))    
                   if ((checkstack(stack)==false)||((*stack).el=='(')||(stack->el=='+')||(stack->el=='-'))   
                     putstack(stack,a[i]);
                        else 
                        {
                        while  ((stack->el!='(')||(stack->el!='*')||(stack->el!='/')||(stack->el!='^'))
                             {outstack(stack,s);
                             b[k]=s;
                             k++;}
                         if (stack->el=='(')
                             outstack (stack,s);
                              putstack(stack,a[i]);
                              }
                              
                              
                              else if (a[i]=='^')
                              if ((checkstack(stack)==false)||((*stack).el=='(')||(stack->el=='+')||(stack->el=='-')||(stack->el=='*')||(stack->el=='/'))   
                               putstack(stack,a[i]);
                               else 
                               {
                        while  ((stack->el!='(')||(stack->el!='^'))
                             {outstack(stack,s);
                             b[k]=s;
                             k++;}
                         if (stack->el=='(')
                             outstack (stack,s); 
                              putstack(stack,a[i]);
                              }       
          i++;
}
while (checkstack(stack)==true)
{
      outstack(stack,s);
      b[k]=s;
      k++;
}
cout<<b<<"\n";  
    system("PAUSE");
    return EXIT_SUCCESS;
}
void initstack (LIFO &top)
{top=NULL;}
bool checkstack (LIFO top)
{return top!=NULL;}
void putstack (LIFO &top,char last)
{
     ref q;
     q=new node;
     (*q).el=last;
     (*q).next=top;
     top=q;
}
void outstack (LIFO &top ,char first)
{
     ref q=top;
     first=(*top).el;
     top=(*top).next;
     delete q;
}
Если ввести 2 операции одного приоритета или скобки то все повисает((иначе выводит цифры только..помогите найти ошибку пожалуйста
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.04.2012, 17:35     Обратная польская нотация
Посмотрите здесь:

Обратная Польская Нотация - C++
Пытался реализовать ОПН....ничего не вышло,обращаюсь за помощью: в чем ошибка(и)? #include &lt;iostream&gt; using namespace std; ...

Обратная польская нотация через структуру - C++
есть такая структура, как через нее сделать ОПН? /*ФУНКЦИЯ ДОБАВЛЕНИЯ ЭЛЕМЕНТА В СТЕК*/ void push(STACK *&amp;Top, int nValue) { STACK...

Польская инверсная нотация - C++
помогите пожалуста зделать !!! уже ниделю сижу никак не могу зделать ((

Тригонометрия и обратная польская запись - C++
Как работает польская запись - понятно, однако как добавить к примеру sin(a), чтобы его не выводило, как sina, а чтобы просто посчитало?

Калькулятор: обратная польская запись - C++
Всем доброго времени суток! Решил написать для себя калькулятор, который бы решал сложные выражения с учетом скобок, каких-либо функций и...

Обратная польская запись (ОПЗ) на С++ - C++
Пожалуйста помогите!!!! не знаю что мне сделать с этими задачами=((((( A. Обратная польская запись (ОПЗ). Постфиксной формой записи...

Калькулятор (обратная польская запись) - C++
Есть калькулятор к нему нужно добавить &quot;(&quot;, &quot;)&quot;.Погуглив понял, что нужно внедрять обратную польскую запись.Помогите внедрить или...

Дополнение к калькулятору, обратная польская запись - C++
Прошу помощи! Вопрос жизни и смерти( Нужно создать класс постфиксных калькуляторов, использовать алгоритм вычисления постфиксных...

Обратная польская запись (порт с Java) - C++
Всем привет! Написал порт обратной польской записи (портировал со своего проекта на Java),но код не работает, можете подсказать, в чём...

Перевод инфиксного выражения в постфиксное (обратная польская запись) - C++
Всем привет! Надо с помощью стека на динамическом массиве реализовать перевод инфиксного выражения в постфиксное. (обратная польская...

Обратная польская запись.Написал программу по алгоритму.Нужно кое-что изменить - C++
Преподаватель дал мне &quot;алгоритм&quot; и сказал написать программу по этому алгоритму. &quot;Алгоритм&quot;:Нам понадобится стек для переменных типа...

Нотация указателей - C++
Преподователь попросил применить нотацию указателей вместо нотации массивов, помогите пожалуйста. Вот мой код #include &lt;iostream&gt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru