Применение стека - PullRequest
       8

Применение стека

0 голосов
/ 27 октября 2018

Я работаю над проблемой преобразования инфикса в постфиксное выражение с использованием стека. Но я получаю ошибку ошибки сегментации. Я не понимаю, где я пытаюсь получить доступ к незаконной памяти?

Я подозреваю, что стековый контейнер STL вызывает некоторую проблему при вставке символов в него за пределами ограничения из-за ограничения размера, но у меня уже есть очень мало записей.

Мой код:

#include <iostream>
using namespace std;
#include <stack>
int isoperand(char ch)
{
  return (ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z');
}
int prec(char ch)
{
   if(ch=='^')
   {return 3;}
   if(ch=='+'||ch=='-')
   {return 1;}
   if(ch=='*'||ch=='/')
   {return 2; }
   return -1;
}
void infixTopostfix(char arr[21])
{stack <char> s;
    for(int p=0;p<21;p++)
    {
        if(isoperand(arr[p]))
        {
            cout<<arr[p];
        }
        else
        {
            if(arr[p]=='(')
            {
                s.push('(');
            }
            if(prec(arr[p])>prec(s.top()))
            {
                s.push('arr[p]');
            }
            if(arr[p]==')')
            {
                while(s.top()!='('||!s.empty())
                {cout<<s.top();
                    s.pop();
                }
            }
            if(prec(arr[p])<=prec(s.top()))
            {
                while(prec(s.top())>=prec(arr[p])||!s.empty())
                {cout<<s.top();
                    s.pop();
                }
            }

        }
    }
    while(!s.empty())
    {
        cout<<s.top();
        s.pop();
    }
}
int main()
{

    char arr[21]={'a','+','b','*','(','c','^','d','-','e',')','^','(','f','+','g','*','h',')','-','i'};
    infixTopostfix(arr);
}

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

Во многих местах вы делаете stack.pop() в цикле, не проверяя, пустой стек или нет. Вы должны проверить не пустоту в стеке, прежде чем пытаться удалить какой-либо предмет из стека.

Проверьте этот код, например: https://ide.geeksforgeeks.org/oFvEQZJs9X

0 голосов
/ 27 октября 2018

, пожалуйста, используйте try catch в тех местах, где вы выполняете функции push или pop стека.

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