Калькулятор стеков на основе двух стеков - PullRequest
0 голосов
/ 02 декабря 2018

Я хотел бы создать алгоритм, основанный на двух стеках, но мой калькулятор плохо работает для оператора ')'.Он должен быть на выходе последнего из стека чисел, но ничего не происходит, когда я добавляю ')'.Любые предложения?

Мы обрабатываем дополнительные токены до конца выражения:

, если мы встречаем число, мы помещаем его обратно в стек значений

, если встречаемсяоператор, мы помещаем его в стек операторов

, если мы сталкиваемся с открывающей скобкой, мы ничего не делаем

, если мы сталкиваемся с закрывающей скобкой, тогда:

  1. вынимаем оператор и два значения из стека
  2. вычисляем значение выражения
  3. помещаем результат в стек значений

вычисляемзначение выражения находится в стеке

    #include <iostream>
#include <string>
#include <sstream>
#include <stack>
#include <vector>
using namespace std;
int main()
{
    string c;
    stack<int>numbers;
    stack<char>operators;
    cin >> c;
    string expression(c);
    for(unsigned int i =0; i <expression.size(); i++)
    {
        if( expression[i] >= 48 && expression[i] <= 57 )
        {
            numbers.push(expression[i]);
        }
        else if(expression[i] == '(')
        {
        ;
        }
        else if(expression[i] == '+')
        {
            operators.push(expression[i]);
        }
        else if(expression[i] ==  '-')
        {
            operators.push(expression[i]);
        }
        else if(expression[i] == '*')
        {
            operators.push(expression[i]);
        }
        else if(expression[i] == '/')
        {
            operators.push(expression[i]);
        }
        else if(expression[i] == ')' )
        {
            if(operators.top()== '+')
            {
                int a,b, score;
                a = numbers.top() - '0';
                numbers.pop();
                b = numbers.top() - '0';
                numbers.pop();
                score = a+b;
                numbers.push(score);
                operators.pop();
            }
            else if(operators.top()== '-')
            {
                int a,b, score;
                a = numbers.top() - '0';
                numbers.pop();
                b = numbers.top() - '0';
                numbers.pop();
                score = b-a;
                numbers.push(score);
                operators.pop();
            }
            else if(operators.top()== '*')
            {
                int a,b, score;
                a = numbers.top()- '0';
                numbers.pop();
                b = numbers.top()- '0';
                numbers.pop();
                score = a*b;
                numbers.push(score);
                operators.pop();
            }
            else if(operators.top()== '/')
            {
                int a,b, score;
                a = numbers.top()- '0';
                numbers.pop();
                b = numbers.top()- '0';
                numbers.pop();
                score = b/a;
                numbers.push(score);
                operators.pop();
            }
        }
    }
    cout << numbers.top()<<endl;
    return 0;
}

1 Ответ

0 голосов
/ 02 декабря 2018

Самые большие проблемы с кодом:

  1. Это будет работать только для однозначных чисел (каждый символ рассматривается как другое число)
  2. Тот факт, что числа являютсястек символов ограничивает число размером символа.Из-за (1) этот предел на самом деле не является проблемой, но когда вы попытаетесь напечатать его в конце, значение char будет обрабатываться как строковое кодирование.Если бы числа вместо этого были целыми числами, они были бы преобразованы в базовое представление 10, которое мы все знаем и любим при печати. ​​
  3. Порядок операндов неправильный (когда вы разбираете их, вы получаете обратный результат того, чтовы сложены).Это особенно проблематично для делений и вычитаний.

В дальнейшем вам может потребоваться фаза токенизатора, которая отвлечет некоторые детали текстового представления в ваш калькулятор.Также помните о сохранении порядка операндов (например, измените score = x-y на score = y-x).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...