Я не могу найти сумму номера префикса, используя стек - PullRequest
0 голосов
/ 05 января 2019
#include <iostream>
#include <string>
using namespace std;
class StackNode
{
public:
    StackNode *  topPtr = NULL;
    StackNode* next;
    string item;
bool push( string newItem) {

   // create a new node
   StackNode *newPtr = new StackNode;

   // set data portion  of new node
   newPtr->item = newItem;

   // insert the new node
   newPtr->next = topPtr;
   topPtr = newPtr;

   return true;
}
bool pop() {

   if (topPtr == NULL)
      return false;

   // stack is not empty; delete top
   else{
      StackNode *temp = topPtr;
      topPtr = topPtr->next;

      // return deleted node to system
      temp->next = NULL;  // safeguard
      delete temp;
      return true;
   }
}
int ope(string op, string val1,string val2)
{

    int vaL1 = stoi(val1);
    int vaL2 = stoi(val2);

    int res = 0;
    if( op == "*")
        res = vaL1 * vaL2;
if( op == "/")
        res = vaL1 / vaL2;
if( op == "-")
        res = vaL1 - vaL2;
if( op == "+")
        res = vaL1 + vaL2;
return res;
}
int cal(string pre_exp[],int len)
{
    int numb = 0;

    for(int i = len -1;i>=0;i--)
    {

       if ( pre_exp[i] == "*" || pre_exp[i] == "/" || pre_exp[i] == "+" || pre_exp[i] == "-")
        {

       string op1 = topPtr->item;
       pop();
       string op2 = topPtr->item;
       pop();

      numb = numb + ope(pre_exp[i],op1,op2);
    }
    else
    {
       push( (pre_exp[i]));
    }
}
  return numb;
}
int main()
{
StackNode nbr;
string eyoo[] = {"+","-","2","3","9"};
cout<< nbr.cal(eyoo,5)<<endl;
return 0;
}

Привет всем, я пытаюсь найти сумму префиксного выражения. Мой код здесь. Странно, я не получаю вывод. Метод cal не возвращает число, возможно, программа застревает в цикле for метода calc. Может кто-то помочь мне, пожалуйста? Методы pop и push работают, я тестировал их методом display. Проблема должна быть в использовании stoi или в методе calc, как я уже сказал.

1 Ответ

0 голосов
/ 05 января 2019
   string op1 = topPtr->item;
   pop();
   string op2 = topPtr->item;
   pop();

вы всегда выталкиваете 2 операнда оператора, который предполагает, что вы выдвигаете результат, но вы этого не делаете, в данный момент времени topPtr становится нулевым, с вашим примером это когда вы делаете string op2 = topPtr->item;

для меня numb = numb + ope(pre_exp[i],op1,op2); необходимо заменить, поместив результат ope(pre_exp[i],op1,op2) в стек в месте двух всплывающих значений

так для {"+","-","2","3","9"}:

  • толчок 9
  • толчок 3
  • толчок 2
  • - так что pop = 2 - pop = 3 = -1, и вам нужно нажать -1
  • + так что pop = -1 + pop = 9 = 8 и вы нажимаете 8 (без нажатия -1 до того, как стек пуст при получении второго операнда)
  • все сделано, чтобы вы получили результат = 8

Тем не менее, я удивлен, что вы, звезда, в конце выражения, я не уверен, что во всех случаях хорошо работает результат, почему вы не начинаете с начала?


Последнее замечание: все ваши методы стараются быть встроенными (определены в классе), мы используем встроенный, когда метод маленький, лучше переместить определения из класса для ваших методов

...