使用链表实现栈功能,然后用栈将中缀表达式转为后缀表达式出现问题error LNK2001: unresolved external symbol

柳成荫0529 2014-10-25 01:15:54
代码如下

/*Stack.h*/
#include "iostream"
#include "cassert"
using namespace std;
#ifndef STACK
#define STACK

typedef int StackElement;
class Stack
{
public:
Stack();
Stack(const Stack& original);
~Stack();
const Stack &operator= (const Stack &rightHandSide);
bool empty() const;
void push(const StackElement& value);
void display(ostream &out) const;
StackElement top() const;
void pop();
private:
class Node
{
public:
StackElement data;
Node *next;
Node(StackElement value,Node *link = 0):data(value),next(link){}
};
typedef Node *NodePointer;
NodePointer myTop;
};
#endif

/*Stack.cpp*/
#include "iostream"
#include "Stack.h"
using namespace std;

Stack::Stack():myTop(0)
{
}


Stack::~Stack()
{
Stack::NodePointer currPtr = myTop,nextPtr;
while(currPtr != 0)
{
nextPtr = currPtr->next;
delete currPtr;
currPtr = nextPtr;
}
}


Stack::Stack(const Stack& original)
{
myTop = 0;
if(!original.empty())
{
myTop = new Stack::Node(original.top());
Stack::NodePointer lastPtr = myTop,origPtr = original.myTop->next;
while(origPtr != 0)
{
lastPtr->next = new Stack::Node(origPtr->data);
lastPtr = lastPtr->next;
origPtr = origPtr->next;
}
}
}


const Stack&Stack ::operator =(const Stack& rightHandSide)
{
if(this != &rightHandSide)
{
this->~Stack();
if(rightHandSide.empty())
myTop = 0;
else
{
myTop = new Stack::Node(rightHandSide.top());
Stack::NodePointer lastPtr = myTop,rhsPtr = rightHandSide.myTop->next;
while(rhsPtr != 0)
{
lastPtr->next = new Stack::Node(rhsPtr->data);
lastPtr = lastPtr->next;
rhsPtr = rhsPtr->next;
}
}
}
return *this;
}


bool Stack::empty() const
{
return (myTop == 0);
}


void Stack::push(const StackElement& value)
{
myTop = new Stack::Node(value,myTop);
}


void Stack::display(ostream& out) const
{
Stack::NodePointer Ptr;
for(Ptr = myTop;Ptr != 0 ;Ptr = Ptr->next)
out<<Ptr->data<<endl;
}


StackElement Stack::top() const
{
if(!empty())
return (myTop->data);
else
{
cerr<<"***Stack is empty -- returning garbage ***\n";
StackElement *temp = new(StackElement);
StackElement garbage = *temp;
delete temp;
return garbage;
}
}


void Stack::pop()
{
if(!empty())
{
Stack::NodePointer Ptr = myTop;
myTop = myTop->next;
delete Ptr;
}
else
cerr<<"*** Stack is empty -- can't remove a value ***\n";
}

/main.cpp/
#include "iostream"
#include "string"
#include "cassert"
#include "cctype"
#include "Stack.h"
using namespace std;

string postfix(string exp);
int main()
{
string infixExp;
cout<<"NOTE:Enter # for infix expression to stop. \n";
for(;;)
{
cout<<"\n Infix expression? ";
getline(cin,infixExp);
if(infixExp == "#")
break;
cout<<"Postfix expression is"<<postfix(infixExp)<<endl;
}
return 0;
}

string posfix(string exp)
{
char token,topToken;
Stack opStack;
string postfixExp;
const string BLANK =" ";
for(int i = 0;i<exp.length();i++)
{
token = exp[i];
switch(token)
{
case ' ': break;
case '(': opStack.push(token);break;
case ')':
for(;;)
{
assert(!opStack.empty());
topToken = opStack.top();
opStack.pop();
if(topToken == '(' ) break;
postfixExp.append(BLANK +topToken);
}
break;
case '+':
case '-':
case '*':
case '/':
case '%':
for(;;)
{
if(opStack.empty()
|| opStack.top() == '('
|| (token == '*' || token == '/' || token == '%')
&& (opStack.top() == '+' || opStack.top() == '-')
)
{
opStack.push(token);
break;
}
else
{
topToken = opStack.top();
opStack.pop();
postfixExp.append(BLANK + topToken);
}
}
break;
default://操作数
postfixExp.append(BLANK + token);
for(;;)
{
if(!isalnum(exp[i+1]) )
break;
i++;
token = exp[i];
postfixExp.append(1,token);
}
}
}

for(;;)
{
if(opStack.empty() ) break;
topToken = opStack.top();
opStack.pop();
if(topToken != '(')
{
postfixExp.append(BLANK + topToken);
}
else
{
cout<<" *** Error in infix expression *** \n";
break;
}
}
return postfixExp;
}

错误信息:
main.obj : error LNK2001: unresolved external symbol "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl postfix(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (
?postfix@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@@Z)
Debug/mystack.exe : fatal error LNK1120: 1 unresolved externals
执行 link.exe 时出错.


有大神帮我看看问题出在哪里吗?


还有当我用类模板的时候为什么函数声明要放在头文件里?
...全文
207 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
罗博士 2014-10-25
  • 打赏
  • 举报
回复
睁大眼睛看清楚 到底是string postfix(string exp); 还是string posfix(string exp)

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧