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

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

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

Author24 — интернет-сервис помощи студентам
Есть код который делает конвертацию например 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.04.2015, 00:02
Ответы с готовыми решениями:

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

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

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

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

2
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
09.04.2015, 02:44 2
Цитата Сообщение от 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
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
09.04.2015, 04:44 3
Проблема в том что строка не в ту сторону парсится. Если в правильную парсить то никакая польская нотация и сортировочная станция не нужны. А тем более если в ноды парсишь. дошел до оператора - разделил строку на две и обе скормил тому же парсеру.
0
09.04.2015, 04:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.04.2015, 04:44
Помогаю со студенческими работами здесь

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

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

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

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

Как сделать чтобы при вводе букв выявляло ошибку о том что другие символы кроме чисел запрещены для ввода?
И так же чтобы вообще ничего нельзя было вводить кроме цифр Тогда и ошибку выявлять не нужно но, я...

Как сделать, чтобы числа выводились подряд
Доброго времени суток!!! Задачка: сделал макрос нахождения простых чисел (с этим проблем нет)....


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru