C ++ Infix到Postfix程序,Stack是否一直空着?

时间:2014-02-11 01:36:02

标签: c++

我正在研究计算机科学课程。我把所有的东西都完成并分成了接口/实现,由于某种原因,程序无限循环并说“Stack is empty!”在调用peek()函数之后。

我试过插入cout<<声明,看看我是否可以查明问题,但是,没有运气。如果其他人可以看一下,我将不胜感激。

谢谢

标题

    #ifndef STACK_H
    #define STACK_H
    /////////////////////////////////////////////////////
    ////Includes/////////////////////////////////////////
    /////////////////////////////////////////////////////
    #include <iostream>
    #include <fstream>
    #include <cstdlib>
    #include <stdlib.h>
    #include <iomanip>
    #include <sstream>
    #include <stdio.h>
    /////////////////////////////////////////////////////
    using namespace std;

    /*-------------------------------------------------------------------------------------------------------------*/
    template <typename Object>
    class Stack
    {
    private:
        class stackListNode
            {
            public:
                Object data;
                stackListNode *next;
            private:
                //Nothing to declare-->placeholder since class 
                //sets data members to private initially
            };

        stackListNode *top;

    public:
        /////////////////////////////////////////////////
        //Constructor Function//////////////////////////
        Stack() {top = NULL;}

            /////////////////////////////////////////////////
            //Rest of functions defined inline for simplicity

            void push(char token)   // Push token onto the stack and create new node for top of stack
                {
                    stackListNode *newNode = new stackListNode;
                    newNode->data = token;
                    newNode->next = top;
                    top = newNode;
                }

            int pop()
                {
                    if(empty())
                    {
                        cout << "Stack is empty!\n" << endl;
                        return NULL;                
                    }

                    stackListNode *temp = top;
                    top = temp->next;
                }

            char peek()
                {
                    if(empty())
                    {
                        cout << "Stack is empty!\n" << endl;
                        return NULL;                
                    }
                    return top->data;
                }

            int empty()
                {
                    return top == NULL;
                }
    };

    #endif  

主档案:

/////////////////////////////////////////////////////
////Includes/////////////////////////////////////////
/////////////////////////////////////////////////////
#include <iostream>
#include <fstream>
#include <string>
#include "Stack.h"
/////////////////////////////////////////////////////
using namespace std;

int precendence(char stack_beginning); //ensures order of operations.
int precendence(char*myArray);
void InFixToPostfix(ifstream& in_file);
double EvaluatePostfix(double first_operand, double second_operand, char*myArray);

int main()
{
////VARS/////////////////////////////////////////////

    string absolutePath;

    cout << endl;
    cout << "Please type in the name of the file you would to open \n";
    cin >> absolutePath;

    ifstream in_file;
    in_file.open(absolutePath.c_str());
    if(!in_file)
    {
        cout << "failed to open input file\n" ;
        return 1 ;
    }
    else
    {
        InFixToPostfix(in_file); //kicks off program
    }

}


void InFixToPostfix(ifstream& in_file)
{
    string infix;
    int right_parentheses =0;
    int left_parentheses =0;

    while(getline(in_file, infix))
    {
        char myArray[infix.size()];
        strcpy(myArray, infix.c_str());

        for(int i = 0; i < sizeof(myArray); i++)
        {
            if(myArray[i] == '(')
            {
                right_parentheses++;
            }
            if(myArray[i] == ')')
            {
                left_parentheses++;
            }
        }
        if(right_parentheses!=left_parentheses)
        {
            cout << endl;
            cout << "There is a typo in one of the expressions in your file \n";
            cout << "Please fix it and rerun the program \n";
            exit(1);
        }

        for(int i = 0; i < sizeof(myArray); i++)
        {
            //int number = int(myArray[i]);
            //deferences the pointer and reads each char in the array
            //as an int rather than a character.
            //int number = myArray[i];
            if(isxdigit(myArray[i]) > 0) //function used to check for hexidecimal values (i.e. int's)
            {
                goto exit_out;
            }
            else if(myArray[i] == '(' || myArray[i] == ')' || myArray[i] == '+' || myArray[i] == '-' || myArray[i] == '*' || myArray[i] == '/' || myArray[i] == '\\' || myArray[i] == '\n')
            {
                goto exit_out;
            }
            else if(myArray[i] == char(32)) //checks to see if there is a space
            {
                goto exit_out;
            }
            else
            {
                cout << endl;
                cout << "There is an invalid character in the file\n";
                exit(1);
            }
        exit_out:;
        }

////////Declares a STRING Stack////////////////////////////////
        Stack<char> stack_string;
////////Declares an Int Stack/////////////////////////////////
        Stack<int> stack_int;
//////////////////////////////////////////////////////////////        
        for(int i = 0; i < sizeof(myArray); i++)
        {
            int number = isxdigit(myArray[i]);
            if(number > 0)
            {
                cout << number;
                //outputs the number b/c it is an operand
            }
            if(myArray[i] == '(')
            {
                stack_string.push(myArray[i]);
            }
            if(myArray[i] == ')')
            {
                //cout << "test";
                while(stack_string.peek() != '(')
                {
                    cout << stack_string.peek();
                    stack_string.pop(); //pops to the peek
                }
            stack_string.pop(); // if there is a ), pops to the peek
            }
            if(myArray[i] == '+' || myArray[i] == '-' || myArray[i] == '/' || myArray[i] == '*')
            {
                if(stack_string.empty())
                {
                    stack_string.push(myArray[i]); //if there's nothing on the stack, pushes the current character
                    //goto done;
                    break; //breaks out of the statement 
                }
                char stack_beginning = stack_string.peek();
                int stack_top = precendence(stack_beginning);
                //int stack_top = precendence(stack_string.peek());
                int operatorHierarchy = precendence(myArray);
                //must be declared here because i will have been interated through array
                if(operatorHierarchy > stack_top)
                {
                    stack_string.push(myArray[i]);
                }
                else if(operatorHierarchy <= stack_top) //could also be an if
                {
                    dump_out:;
                    cout << stack_string.peek();
                    stack_string.pop();

                    int rerunThroughStack =0;
                    char new_stack_beginning = stack_string.peek();
                    rerunThroughStack = precendence(new_stack_beginning);
                    if(operatorHierarchy < stack_top)
                    {
                        stack_string.push(myArray[i]);
                        goto done; //could break
                    }
                    if(stack_string.peek() == '(')
                    {
                        stack_string.push(myArray[i]);
goto done;  
                    }
                    if(stack_string.empty())
                    {
                        stack_string.push(myArray[i]);
                        goto done;
                    }
                goto dump_out;
                }
            }
            done:;
        }
        cout << stack_string.peek() << endl;

//////////Evaluate Section/////////////////////////////

        for(int i = 0; i < sizeof(myArray); i++)
        {
            if(isxdigit(myArray[i]) > 0) //this is a number
            {
                stack_int.push(isxdigit(myArray[i]));
                goto end;
            }
            else if(myArray[i] == '*' || myArray[i] == '+' || myArray[i] == '-' || myArray[i] == '/')
            {
                double first_operand;
                first_operand = stack_int.peek(); //fetches first operand on the stack_int
                stack_int.pop();
                //////////////////
                double second_operand;
                second_operand = stack_int.peek();
                stack_int.pop();
                //////////////////
                double answer;
                answer = EvaluatePostfix(first_operand, second_operand, myArray); //THIS PROBABLY IS NOT RIGHT
                stack_int.push(answer);
            }
        end:;
        }
                    /*
                    int size_of_stack;
                    size_of_stack = stack_int.size();
                    if(size_of_stack == 1)
                    {
                        cout << stack_int.peek();
                    }
                    */
    }
}

double EvaluatePostfix(double first_operand, double second_operand, char* myArray) //might have to pass array as reference
{
    /*
        Cycle through the characters passed in through myArray[i];
    */
    for(int i = 0; i < sizeof(myArray); i++)
    {
        if(myArray[i] == '*')
        {
            double first_answer;
            first_answer = (second_operand * first_operand);
            return first_answer;
        }
        else if(myArray[i] == '/')
        {
            double second_answer;
            second_answer = (second_operand / first_operand);
            return second_answer;
        }
        else if(myArray[i] == '+')
        {
            double third_answer;
            third_answer = (second_operand + first_operand);
            return third_answer;
        }
        else if(myArray[i] == '-')
        {
            double fourth_answer;
            fourth_answer = (second_operand - first_operand);
            return fourth_answer;
        }
        /*
        else
        {
            cout << "There must be an error in your file" <<endl;
            break;
            exit(1);
        }
        */
    }
}




int precendence(char stack_beginning)
{
    int precendence;
    if(stack_beginning == '*' || stack_beginning == '/')
    {
        precendence = 2;
        return precendence;
    }
    //by making it 2, the precendence is dubbed less than +/-
    if(stack_beginning == '+' || stack_beginning == '-')
    {
        precendence = 1;
        return precendence;
    }
}    //by making it 1, the precendence is dubbed greater than */"/"


int precendence(char*myArray)
{
    int precendence;
    for(int i = 0; i < sizeof(myArray); i++)
    {
        if(myArray[i] == '*' || myArray[i] == '/')
            {
                precendence = 2;
                return precendence;
            }
            //by making it 2, the precendence is dubbed less than +/-
            if(myArray[i] == '+' || myArray[i] == '-')
            {
                precendence = 1;
                return precendence;
            }
    }    //by making it 1, the precendence is dubbed greater than */"/"
}

0 个答案:

没有答案