Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
138 / 7 / 1
Регистрация: 31.03.2015
Сообщений: 395

Как сделать чтобы в постфиксной записи кроме цифр выводились еще и обычные символы

09.04.2015, 00:02. Показов 829. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть код который делает конвертацию например 1 + 2 * 3 -->123*+
но а + b* c -->с -- то есть лиш последний введеный символ что здесь не так и что надо сделать?
Проблема наверное в методе
C++
1
2
3
4
5
6
7
bool IsOperand(const string& x)
{
    string y;
    stringstream ss(x);
    if (ss >>y[0]) return true;
    else return false;
}
-- хотя это булевский тип что ничего как бы не возвращает. Но при замене на
C++
1
2
3
4
5
6
{
    char* y;
    stringstream ss(x);
    if (ss >>*y) return true;
    else return false;
}
--такое получается.
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#include <limits.h>
#include <iostream>
#include <string>
#include <sstream>
#include <cassert>
using namespace std;
 
typedef struct Node{
    // store operator or operand
    string data;
    // only valid for operator
    int precedence;
    struct Node* parent;
    struct Node* left;
    struct Node* right;
} CNode, *PNode;
 
PNode CreateNode(const string& x)
{
    PNode p = new CNode;
    p->parent = p->left = p->right = NULL;
    p->data = x;
    return p;
}
bool IsOperator(const string& x)
{
    // Since the only impact of parentheses () is on precedence,
    // they are not considered as operators here
    return ((x.length() == 1) &&
            (x[0] == '*' ||
            x[0] == '/' ||
            x[0] == '+' ||
            x[0] == '-' ||
            x[0] == '=' ||
            x[0] == '>' ||
            x[0] == '<' ||
            x[0] == '&'
            ));
}
bool IsLeftParenthesis(const string& x)
{
    return x == "(";
}
bool IsRightParenthesis(const string& x)
{
    return x == ")";
}
bool IsOperand(const string& x)
{
    string y;
    stringstream ss(x);
    if (ss >>y[0]) return true;
    else return false;
}
int GetPrecedence(const string& x)
{
    assert(IsOperator(x));
    if (x[0] =='*'||x[0]=='/') return 5;
    else if (x[0] =='+'||x[0]=='-') return 4;
    else if (x[0] =='<'||x[0]=='>') return 3;
    else if (x[0] =='&') return 2;
    else return 1;
}
PNode CreateInfixTree(const string& exp)
{
    // create a dummy root with minimal precedence
    // its content is trivial
    PNode root = CreateNode("0");
    root->precedence = 0;
    // the previous operand of current operator
    PNode preOperand = NULL;
    // the previous operator of current operator
    PNode preOperator = root;
    // the impact of preceding parenthesis, if any
    int correction = 0;
    string token;
    stringstream ss(exp);
    while (ss >> token)
    {
        if (IsOperand(token))
        {
            preOperand = CreateNode(token);
        }
        else if (IsOperator(token))
        {
            PNode p = CreateNode(token);
            p->precedence = GetPrecedence(token) + correction;
            if (p->precedence > preOperator->precedence)
            {
                p->left = preOperand;
                preOperator->right = p;
                p->parent = preOperator;
            }
            else
            {
                preOperator->right = preOperand;
                PNode q = preOperator->parent;
                while (p->precedence <= q->precedence) q = q->parent;
 
                p->left = q->right;
                q->right = p;
                p->parent = q;
            }
            preOperand = NULL;
            preOperator = p;
 
        }//else if (IsOperator(token)
        else if (IsLeftParenthesis(token))
        {
            correction += 2;
        }
        else if (IsRightParenthesis(token))
        {
            correction -= 2;
        }
        else
        {
            cout << "illegal token found: " << token << endl;
            break;
        }
    }//while
 
    if (preOperand == NULL)
        cout << "illegal expression: cannot end with operator: "
             << preOperator->data << endl;
    else preOperator->right = preOperand;
 
    // delete dummy root
    PNode realRoot = root->right;
    delete root;
    if (realRoot) realRoot->parent = NULL;
    return realRoot;
}
 
void PostOrderPrintTree(PNode node)
{
    if (node)
    {
        PostOrderPrintTree(node->left);
        PostOrderPrintTree(node->right);
        cout << node->data;
    }
}
 
int main()
{
    // valid operators: + - * / ( )
    // valid operands: integers
    // whitespace separated as: ( 1 + 2 ) * 3
    string exp;
    getline(cin, exp);
    PNode root = CreateInfixTree(exp);
    PostOrderPrintTree(root);
    cout << endl;
}
Что здесь надо сделать чтобы код выводил все символы char?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.04.2015, 00:02
Ответы с готовыми решениями:

Как сделать чтобы записи выводились анонсом?
Привет всем! У меня проблема. Поставил шаблон на свой блог, написанный на WordPress. В настройках поставил чтобы на главной странице...

Как сделать так чтобы считывался пробел и не выводились несколько раз повторенные символы
Как сделать так чтобы считывался пробел и не выводились несколько раз повторенные символы Вот код программы: ...

Как сделать так, чтобы при клике на рубрику выводились все записи, что в этой рубрике
На страницу выводятся рубрики. Как сделать так, чтобы при клике на рубрику выводились все записи, что в этой рубрике?

2
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
09.04.2015, 02:44
Цитата Сообщение от arts1 Посмотреть сообщение
{
* * char* y;
* * stringstream ss(x);
* * if (ss >>*y) return true;
* * else return false;
}
Куда читаем? Память под указатель не выделена.

Добавлено через 45 минут
Цитата Сообщение от arts1 Посмотреть сообщение
Что здесь надо сделать чтобы код выводил все символы char?
Как этот код работает вот с этой строкой: 1 + 2 * 3
Нормально? Что выводит?

Добавлено через 9 минут
C++
1
2
3
4
5
6
7
8
9
bool IsOperand(const string& x)
{
    string y;
    stringstream ss(x);
    if (ss >>y[0]) 
        return true;
    else 
        return false;
}
Что, собственно, эта функция проверяет? - string y - пустая строка, к ней нельзя обращаться по индексу.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
09.04.2015, 04:44
Проблема в том что строка не в ту сторону парсится. Если в правильную парсить то никакая польская нотация и сортировочная станция не нужны. А тем более если в ноды парсишь. дошел до оператора - разделил строку на две и обе скормил тому же парсеру.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.04.2015, 04:44
Помогаю со студенческими работами здесь

Можно ли сделать в Паскале, чтобы символы выводились не сразу, а со временем
Можно ли сделать в Паскале , чтобы символы выводилсь не сразу, а со временем.

Сделать так, чтобы записи из таблицы выводились по 20 записей на странице
Всем день добрый. Подскажите пожалуйста. необходимо сделать так что бы записи из таблицы выводились по 20 записей на странице. Вот здесь...

Работа со строками ( сделать так, чтобы введенные символы с пробелом выводились в виде идентификаторов)
Здравствуйте! Столкнулась с такой проблемой: Не получается сделать так, чтобы введеные символы с пробелом выводились в виде...

Сделать так, чтобы по нажатию на ссылку в list.php выводились определенные записи из БД
Здравствуйте. Начинаю изучать php, есть небольшая проблемка. У меня есть страница index.php, на ней есть меню (категории товара). Как...

Как сделать чтобы при вводе 0 и других символов, кроме цифр ничего не вводилось?
Подскажите пожалуйста.


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru