首页 文章

无法运行中缀到postix堆栈转换程序

提问于
浏览
-1

我每次在Visual Studio上都会收到相同的错误消息 . 我不知道错误源自何处 . 基本上我正在尝试使用堆栈将中缀表达式(A B-C)转换为后缀表达式(AB C-) . 任何帮助将不胜感激

DriverExpression.cpp Expression.obj:错误LNK2019:未解析的外部符号“public:__thiscall stackType :: stackType(int)”(?? 0?$ stackType @ D @@ QAE @ H @ Z)在函数“public:void”中引用__thiscall Expression :: convertInfixToPostfix(void)“(?convertInfixToPostfix @ Expression @@ QAEXXZ)Expression.obj:错误LNK2019:未解析的外部符号”public:__thiscall stackType :: ~clipType(void)“(?? 1?$ stackType @ D @@ QAE @XZ)在函数“public:void __thiscall Expression :: convertInfixToPostfix(void)”中引用(?convertInfixToPostfix @ Expression @@ QAEXXZ)Expression.obj:错误LNK2019:未解析的外部符号“public:char __thiscall stackType :: top (void)const“(?top @?$ stackType @ D @@ QBEDXZ)在函数”public:void __thiscall Expression :: convertInfixToPostfix(void)“中引用(?convertInfixToPostfix @ Expression @@ QAEXXZ)Expression.obj:错误LNK2019:未解析的外部符号“public:void __thiscall stackType :: initializeStack(void)”(?initializeStack @?$ stackType @ D @@ QAEXXZ)参考d in function“public:void __thiscall Expression :: convertInfixToPostfix(void)”(?convertInfixToPostfix @ Expression @@ QAEXXZ)Expression.obj:error LNK2019:unresolved external symbol“public:bool __thiscall stackType :: empty(void)const”( ?empty @?$ stackType @ D @@ QBE_NXZ)在函数“public:void __thiscall Expression :: convertInfixToPostfix(void)”中引用(?convertInfixToPostfix @ Expression @@ QAEXXZ)Expression.obj:错误LNK2019:未解析的外部符号“public: void __thiscall stackType :: push(char)“(?push @?$ stackType @ D @@ QAEXD @ Z)在函数”public:void __thiscall Expression :: convertInfixToPostfix(void)“中引用(?convertInfixToPostfix @ Expression @@ QAEXXZ) Expression.obj:错误LNK2019:未解析的外部符号“public:void __thiscall stackType :: pop(void)”(?pop @?$ stackType @ D @@ QAEXXZ)在函数“public:void __thiscall Expression :: convertInfixToPostfix”中引用(void )“(?convertInfixToPostfix @ Expression @@ QAEXXZ)C:\ Users \ Jake Bock \ Desktop \ CSC 240 \ Project 7 \ JBock_Project 7 \ Debug \ JBock_Project7.exe:致命错误LNK1120:7个未解析的外部**

#include <iostream>
#include <fstream>
#include <string>
#include <stack>
#include "Expression.h"
#include "stackType.h"

using namespace std;

int main()
{

    string fileName;
    string infixExpression, postfixExpression;
    Expression expression;
    cout << "Converting infix expression to postfix expression\n"
         << "testing infix expressions are in input file\n";
    cout << "Enter the input file name ";
    cin  >> fileName;
    ifstream inData;
    ofstream outData;
    inData.open(fileName.c_str());
    outData.open("out.txt");
    cout<<"open="<<fileName<<endl;   //debugging print
    while(inData>>infixExpression)
    {
        cout<<"Infix="<<infixExpression<<endl; //debugging print
        expression.setInfix(infixExpression);
        cout<<"setInfix="<<infixExpression<<endl;//debugging print
        expression.convertInfixToPostfix();
        cout<<"convert="<<infixExpression<<endl; //debugging print
        postfixExpression = expression.getPostfix();
        cout    << "Infix Expression: "
                << infixExpression <<"\n"
                << "Postfix Expression: "
                <<postfixExpression<<"\n\n";
        outData << "Infix Expression: "
                << infixExpression <<"\n"
                << "Postfix Expression: "
                <<postfixExpression<<"\n\n";
    }

    inData.close();
    outData.close();

    system("pause");
    return 0;
}

================================================== ==============

#ifndef EXPRESSION_H_
#define EXPRESSION_H_
#include "stackType.h"

class Expression
{
private:
    std::string infixExpression;
    std::string postfixExpression;

    bool precedence(char s, char operator2); //ToDo
    bool isOperand(char symbol);                     //ToDo

public:

    Expression();
    void setInfix(std::string infix);
    std::string getInfix();
    std::string getPostfix();
    void convertInfixToPostfix();        //ToDo
    static void convertInfixToPostfix(   //ToDo
                std::string& infix,
                std::string& postfix);
    virtual ~Expression();
};

#endif /* EXPRESSION_H_ */

#include <stack>
#include <string>
#include <sstream>
#include "Expression.h"
#include "stackType.h"
#include <iostream>
using namespace std;


Expression::Expression() : infixExpression(""), postfixExpression(""){}


void Expression::setInfix(string infix)
{
    infixExpression= infix;
}


string Expression::getInfix()
{
    return infixExpression;
}


string Expression::getPostfix()
{
    return postfixExpression;
}


void Expression::convertInfixToPostfix()
{
    /*Define operator stack*/
    stackType<char> s(infixExpression.size());
    s.initializeStack();
    ostringstream strstream;

    int operand = 0;
    /*String stream will help us pushing integer to our stream easily.
    This is similar to sprintf(), but with less hassles.*/
    int size = infixExpression.size();
    int iter = 0;
    for (; iter < size; ++iter)
    {
        switch (infixExpression[iter])
        {
        case '+':
        case '-':
        case '/':
        case '*':
            {
                if (s.empty())
                {
                    /*We always push the first operator*/
                    s.push(infixExpression[iter]);
                }
                else
                {
                    /*if precedence of current operator is higher than
                    one on top of the stack, we simply push the current
                    operator to the top of the stack*/
                    if (precedence(s.top(), infixExpression[iter]))
                    {
                        s.push(infixExpression[iter]);
                    }
                    else
                    {
                        /*Pop from the stack and append it to string stream.
                        Repeat it unless we find an operator on top of the stack
                        whose precedence is lower or stack is empty.*/
                        do
                        {
                            strstream << s.top() << ' ';
                            s.pop();
                        }while (!s.empty() && !precedence(s.top(), infixExpression[iter]));
                        /*Now push the current operator to the stack*/
                        s.push(infixExpression[iter]);
                    }
                }
                break;
            }
        case ' ':
            {
                break;
            }
        default:
            {

                while (iter < size && infixExpression[iter] >= '0' && infixExpression[iter] <= '9')
                {
                    operand = operand * 10 + (infixExpression[iter]-'0');
                    ++iter;
                }
                strstream << operand << ' ';
                operand = 0;
                --iter;
                break;
            }
        }
    }
    /*Pop one by one from operator stack and append it to our stream*/
    while(!s.empty())
    {
        strstream << s.top() << ' ';
        s.pop();
    }
    /*Get the string associated with our string stream*/
    postfixExpression = strstream.str();
}


bool Expression::precedence(char s, char operator_specified)
{

    if ((operator_specified == '+') || (operator_specified == '-'))
        return false;
    char top_operator = s;
    if ((top_operator == '+') || (top_operator == '-'))
        return true;
    else
        return false;
}

Expression::~Expression()
{
}

// ================================================ =======================================

#ifndef STACKTYPE_H_
#define STACKTYPE_H_


template <class T>
class stackType
{
private:

    int maxStackSize;
    int stackTop;
    char *list;

    void copyStack(const stackType& otherStack);

public:

    stackType();
    stackType(int stackSize);
    ~stackType();
    char top() const;
    void initializeStack();
    bool empty() const;
    void push(const char newItem);
    bool isFullStack() const;
    void pop();
    const stackType& operator=(const stackType& otherStack);
};

#endif /* stackType_H_ */

#include "stackType.h"
#include <stack>
#include <cassert>

template <class T>
stackType<T>::stackType(){}

template <class T>
stackType<T>::stackType(int stackSize)
{
    if (stackSize <= 0)
    {
        cout << "Size of the array to hold the stack must be positive" << endl;
        cout << "Creating an array of size 100" << endl;

        maxStackSize = 100;
    }
    else
        maxStackSize = stackSize;

    stackTop = 0;
    list = new char[maxStackSize];
}

template <class T>
stackType<T>::~stackType()
{
    delete [] list;
}

template <class T>
char stackType<T>::top() const
{
    assert(stackTop != 0);
    return list[stackTop - 1];
}

template <class T>
void stackType<T>::initializeStack()
{
    stackTop = 0;
}

template <class T>
bool stackType<T>::empty() const
{   
    return (stackTop == 0);
}

template <class T>
bool stackType<T>::isFullStack() const
{
    return (stackTop == maxStackSize);
}

template <class T>
void stackType<T>::pop()
{
    if (!isEmptyStack())
        stackTop--;
    else
        cout << "Cannot remove from an empty stack" << endl;
}

template <class T>
void stackType<T>::push(const char newItem)
{
    if (!isFullStack())
    {
        list[stackTop] = newItem;
        stackTop++;
    }
    else
        cout << "Cannot add to a full stack" << endl;
}

template <class T>
void stackType<T>::copyStack(const stackType& otherStack)
{
    delete [] list;
    maxStackSize = otherStack.maxStackSize;
    stackTop = otherStack.stackTop;
}


template <class T>
const stackType<T>& stackType<T>::operator=(const stackType& otherStack)
{
    if (this != &otherStack)
        copyStack(otherStack);
    return *this;
}

2 回答

  • 0

    unresolved external symbol

    好的,所以你在这里遇到了链接器错误 . 每当你得到它,这是解决它的过程 . 首先,让我们看看错误消息 .

    public: __thiscall stackType::stackType(int)" (??0?$stackType@D@@QAE@H@Z) referenced in function "public: void __thiscall Expression::convertInfixToPostfix(void)" (?convertInfixToPostfix@Expression@@QAEXXZ)

    • 弄明白什么方法't linking. Looking at the error message, it'清楚 stackType::stackType(int) .

    现在发生了什么是你的方法(在这种情况下,一个构造函数)被声明但从未定义 . 所以,仔细阅读清单......

    • stackType.cpp是否包含在您的构建中?

    • 你还记得在.cpp文件中编写stackType :: stackType(int)吗?

    • 这两个函数的方法签名是否相同?你有一个const方法而另一个没有吗?

    • 类或方法名称中的任何奇怪的拼写错误?

    • 你做错了涉及模板吗?

    我的猜测是#4是罪魁祸首,因为stackType是一个模板类 . 您需要将所有这些方法定义粘贴到 Headers 中,可能不是 .

  • 0

    所以问题出来了我只需要在头文件中保留模板类成员函数定义 . Oy公司 .

相关问题