使用链表实现栈功能,然后用栈将中缀表达式转为后缀表达式出现问题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 时出错.


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


还有当我用类模板的时候为什么函数声明要放在头文件里?
...全文
217 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
罗博士 2014-10-25
  • 打赏
  • 举报
回复
睁大眼睛看清楚 到底是string postfix(string exp); 还是string posfix(string exp)
标题SpringBoot钓鱼论坛小程序的设计与实现AI更换标题第1章引言阐述SpringBoot钓鱼论坛小程序的研究背景、意义、国内外现状、研究方法及创新点。1.1研究背景与意义分析钓鱼运动的发展现状及论坛小程序对钓鱼爱好者的价值。1.2国内外研究现状概述国内外钓鱼论坛及小程序的发展现状和技术应用。1.3研究方法以及创新点介绍SpringBoot技术及本论文的研究方法和创新之处。第2章相关理论总结和评述与SpringBoot钓鱼论坛小程序开发相关的理论。2.1SpringBoot框架概述介绍SpringBoot框架的核心特性及其在Web开发中的应用。2.2前端技术基础阐述小程序开发中常用的前端技术,如HTML、CSS、JavaScript。2.3数据库技术介绍数据库设计原则及MySQL数据库在论坛小程序中的应用。第3章SpringBoot钓鱼论坛小程序设计详细介绍SpringBoot钓鱼论坛小程序的整体设计方案。3.1系统架构设计系统的整体架构,包括前端、后端和数据库的交互。3.2功能模块设计详细设计用户管理、帖子发布、评论互动等核心功能模块。3.3数据库设计阐述数据库表结构、字段设计以及数据关系。第4章SpringBoot钓鱼论坛小程序实现介绍SpringBoot钓鱼论坛小程序的具体实现过程。4.1开发环境搭建介绍开发所需的软件、硬件环境及配置步骤。4.2核心功能实现阐述用户注册登录、帖子发布与展示、评论与回复等功能实现。4.3界面设计与优化介绍小程序界面的设计原则、实现效果及优化措施。第5章系统测试与性能分析对SpringBoot钓鱼论坛小程序进行系统测试和性能分析。5.1测试环境与方法介绍测试所需的硬件、软件环境及测试方法。5.2功能测试与结果分析对各个功能模块进行测试,并分析测试结果。5.3性能测试与优化建议对系统进行性能测试,提出优化建议。第6章结论与展望总结S

33,321

社区成员

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

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