Инфикс для постфикса с использованием стеков с алгоритмом профессора - PullRequest
0 голосов
/ 01 октября 2019

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

Вот полученный алгоритм: enter image description here

Вот код, который я пытался сделать:

#include <iostream>
#include "ecpe202.h"
#define Max 100

using namespace std;

int getICP(char x){
    if (x == ')'){
        return 0;
    }
    else if (x == '^'){
        return 4;
    }
    else if (x == '*' || x == '/'){
        return 2;
    }
    else if (x == '+' || x == '-'){
        return 1;
    }
    else if (x == '('){
        return 4;
    }
}

int getISP(char x){
    if (x == ')'){
        return 0;
    }
    else if (x == '^'){
        return 3;
    }
    else if (x == '*' || x == '/'){
        return 2;
    }
    else if (x == '+' || x == '-'){
        return 1;
    }
    else if (x == '('){
        return 0;
    }
}

bool isOperator(char ch){
    if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '^' || ch == '*' || ch == '(' || ch == ')'){
        return (true);
    }
    else{
        return (false);
    }
}

int main(){
    char infix[Max];
    char ch;
    int length;
    myQueue que;
    myStack stk;
    createQ(que);
    createS(stk);

    cout << "Enter an infix Expression: ";
    cin >> infix;
    cout << endl << endl;
    cout << "The postfix Expression: ";

    length = strlen(infix);

    for (int i = 0; i < length; i++){
        addQ(que, infix[i]);
    }

    while (!isEmptyQ(que)){
        ch = retrieveQ(que);

        //start of infix to postfix algo
        //1. push
        if (ch == '('){
            pushS(stk, ch);
        }
        //2. if scanned is operand
        if (!isOperator(ch)){
            cout << ch;
        }
        else{
            //2.1 push if...
            if (isEmptyS(stk) || getICP(ch) > getISP(topS(stk)) || topS(stk) == '('){
                pushS(stk, ch);
            }
            //2.2. pop all operators
            else{
                while(!isEmptyS(stk) && getISP(topS(stk)) >= getICP(ch) || topS(stk) == '('){
                    cout << popS(stk);
                }
            }
            pushS(stk, ch);
        }
        //3. If scanned ')'
        bool loop = true;
        if (ch == ')'){
            do{
                if (ch == '('){
                    loop = false;
                }
                else{
                    cout << popS(stk);
                }
            }while(loop == true);
        }
        //repeat 1-3
    }

    cout << endl;
}

Для ecpe202.h:

#include<dos.h>
#include<windows.h>

#define FOREVER true
#define MAXSTACK 100
#define MAXQUEUE 100

using namespace std;


struct myStack{
    int tos;
    char s[MAXSTACK];
};

struct myQueue{
    int head, tail, q[MAXQUEUE];
};

//STACK
void createS(myStack &S){
    S.tos=-1;
}

void pushS(myStack &S, char item){
    S.s[++S.tos] = item;
}

char popS(myStack &S){
    return(S.s[S.tos--]);
}

char topS(myStack S){
    return (S.s[S.tos]);
}

bool isFullS(myStack S){
    if(S.tos == MAXSTACK - 1)
        return true;
    return false;
}

bool isEmptyS(myStack S){
    if (S.tos == -1)
        return true;
    return false;
}

//QUEUE
void createQ(myQueue &Q){
    Q.head = 0;
    Q.tail = 0;
}

void addQ(myQueue &Q, char item){
    Q.q[Q.tail++] = item;
    Q.tail %= MAXQUEUE;
}

char retrieveQ(myQueue &Q){
    char temp;
    temp = Q.q[Q.head++];
    Q.head %= MAXQUEUE;
    return temp;
}

bool isFullQ(myQueue Q){
    if (Q.tail == MAXQUEUE)
        return true;
    return false;
}

bool isEmptyQ(myQueue Q){
    if (Q.tail == Q.head)
        return true;
    return false;
}

//GOTOXY
void gotoxy(int x, int y){
    COORD coord;
    coord.X = x;
    coord.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}

void clrscr(){
    system("CLS");
}

Вывод, который мой код: enter image description here

Что не так в моей программе? попытался перечитать пару раз, но я все еще не могу это исправить.

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