求解......运算符优先法实现四则运算表达式
#include<iostream.h>
#include"stdio.h"
#include"malloc.h"
#define STACK_INIT_SIZE 100;
#define STACKINCRMENT 10;
///////////////////////////////////////////////////////////////////////////////
template<class exam>class stack{
private:
exam * base;
exam * top;
int stacksize;
public:
stack();
exam Gettop(){ if(top == base) cout<<"ERROR"<<endl; return *(top-1); }
void push(exam e);
exam pop();
};///////////////////////////////////////////////////////////////////////////
template<class exam>
stack<exam>::stack(){
//构造一个空的栈
base = (exam *) malloc(STACK_INIT_SIZE * sizeof(exam));
if(!base) cout << "ERROR"<<endl;
top = base;
stacksize = STACK_INIT_SIZE;
}/////////////////////////////////////////////////////////////////////////
template<class exam>
void stack<exam>::push(exam e){
//插入E为新的元素
if(top - base >= stacksize){//栈满。追加存储空间
base = (exam *) realloc (base,(stacksize + STACKINCRMENT)*sizeof(exam));
if(!base) cout << "ERROR"<<endl;
top = base + stacksize;
stacksize += STACKINCRMENT;
}
* top++ = e;
}//push
template<class exam>
exam stack<exam>::pop(){
//若栈不空,则删除栈顶元素,并返回;
// 否则返回 ERROR
if(top == base) cout << "ERROR"<<endl;
return * --top;
}
////////////////////////////////////////////////////////////////////////
char Precede(char a,char b){
switch(a){
case '+':
case '-':
switch(b){
case '+':
case '-':
case ')':
case '#':
return '>';break;
case '*':
case '/':
case '(':
return '<';break;
}
case '*':
case '/':
if( b =='(' ) return '<';
else return '>';
break;
case '('://假设#不会出现
if( b ==')' ) return '=';
else return '<';
break;
case ')'://假设(不会出现
return '>'; break;
case '#'://假设)不会出现
if( b== '#' ) return '=';
else return '<';
break;
}
}//////////////////////////////////////////////
int Operate(int aa,char temp,int bb){
switch(temp){
case '+': return (aa + bb);break;
case '-': return (aa - bb);break;
case '/':
return (aa / bb);break;
case '*': return (aa * bb);break;
}
}
template<class exam>
void main(){
//算术表达式求值优先算法。设OPTR和OPND分别为运算符栈和运算数栈,
stack<char> OPTR;
stack<int> OPND;
OPTR.push('#');
cout << "请输入表达式并以“#”开始和结束:"<<endl;
exam c =getchar();
char temp;
int aa,bb;
while(c != '#' || OPTR.Gettop() !='#'){
if(sizeof(c)>1) { OPND.push(c);c = getchar();} //不是运算符则进栈
else
switch(Precede(OPTR.Gettop(),C)){
case '<': //栈顶元素优先级低
OPTR.push(c); c = getchar();
break;
case '=': //脱括号并接收下一字符
OPTR.pop(); c = getchar();
break;
case '>': //退栈并把运算结果入栈
temp = OPTR.pop();
bb = OPND.pop() ;
aa = OPND.pop() ;
OPND.push(Operate(aa,temp,bb));
break;
}
}
cout << "结果为:"<<endl;
cout <<OPND.pop()<<ednl;
}
总是提示错误...
Linking...
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/表达式.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
问题点数:40、回复次数:6Top
1 楼goodluckyxl(被人遗忘的狗)回复于 2004-11-02 18:24:19 得分 5
搞的main都找不到了Top
2 楼imRainman(雨人)回复于 2004-11-02 19:02:37 得分 5
@_@Top
3 楼horisly(SUN YAT-SEN UNIVERSITY (逸仙先生))回复于 2004-11-02 19:09:49 得分 20
本人写的:
/***************************************************************/
/* */
/* */
/* Stack类模板(文件Stack.h) */
/* */
/* */
/***************************************************************/
#include<iostream>
#include<conio.h>
#define STACKSIZE 50
template<class Type> //定义一个Stack的类模板
class Stack{
private:
Type buffer[STACKSIZE]; //开辟栈区
Type * sp; //设置栈顶指针
public:
Stack(){
sp=buffer;
}
void Empty() {sp=buffer;} //清空栈
bool IsEmpty(); //判断是否空栈
bool IsFull();
void Push(Type); //入栈
Type Pop(); //弹出
Type Top();
};
template<class Type> //IsEmpty()
bool Stack<Type>::IsEmpty(){
if(sp==buffer)
return true;
else
return false;
}
template<class Type> //IsFull()
bool Stack<Type>::IsFull(){
if(sp>=buffer+STACKSIZE)
return true;
else
return false;
}
template<class Type> //Push()
void Stack<Type>::Push(Type e){
if(IsFull())
cerr << "Stack overflow !" << endl;
else
*sp++=e;
}
template<class Type> //Pop()
Type Stack<Type>::Pop(){
if(IsEmpty()){
cerr << "Stack is Empty!" << endl;
return 0;
}
else
return *--sp;
}
template<class Type>
Type Stack<Type>::Top(){
if(IsEmpty()){
cerr << "Stack is Empty!" << endl;
return 0;
}
else
return *(sp-1);
}
/******************************************************************/
/* */
/* */
/* 简单计算器Calculator(文件Calculator.cpp) */
/* */
/* */
/******************************************************************/
#include<iostream.h>
#include<stdlib.h>
#include"Stack.h"
class Calculator{
private:
Stack<long> Nstack; //定义一个long型的数据栈
Stack<char> Ostack; //定义一个char型的符号栈
public:
Calculator(){
cout<<"Calculate: input the expression and end the expression with \'=\' \n";
cout<<"Clear the Calculator's stacks,input a \'C\' \n";
cout<<"Close the Calculator,input a \'Z\' \n " ;
}
char Precede(char,char); //用于比较前后两个符号的优先级
long Operate(long,char,long); //从Nstack弹出的两个数的计算
void Clear(); //清空两个栈
void Cal();
};
void Calculator::Clear(){
Nstack.Empty();
Ostack.Empty();
Ostack.Push('='); //预置Ostack栈底元素为=
}
void Calculator::Cal(){
bool b1=true,b2;
char ch,num[10];
int k=-1;
char op;
long a,b;
Clear();
while(b1){
cin>>ch;
if(ch>='0' && ch<='9'){
k++;
num[k]=ch; //数字字符插进串中
}
else{
if(k>=0){
num[k+1]='\0';
Nstack.Push(atol(num));
k=-1;
}
if(ch=='c'){ //C字符表示清空栈
Clear();
continue;
}
if(ch=='z') break; //z字符结束计算器
b2=true;
while(b2){
if( (ch=='=') && ( Ostack.Top() == '=' ) ){ //如果栈顶和ch都为=,表示已经全部计算完
cout<<Nstack.Pop()<<endl;
b2=false;
break;
}
switch(Precede(Ostack.Top(),ch)){ //与栈顶运算符比较优先级
case '<' :
Ostack.Push(ch);b2=false;
break;
case '=' :
Ostack.Pop();b2=false;
break;
case '>' :
op=Ostack.Pop();
b=Nstack.Pop();
a=Nstack.Pop();
Nstack.Push(Operate(a,op,b));
break;
} //switch;
} //while(b);
} //else;
} //while(true);
}
char Calculator::Precede(char c1,char c2){ //比较c1与c2的优先级 c1在c2左边
switch(c1){
case '+' :
case '-' :
if( (c2=='*') || (c2=='/') || (c2=='(') )
return '<';
else
return '>';
case '*' :
case '/' :
if( c2=='(' )
return '<';
else
return '>';
case '(' :
if( c2=')' )
return '=';
else
return '<';
case ')' :
return '>';
case '=' :
if(c2=='=')
return '=';
else
return '<';
} //switch(c1);
} //Precede()
long Calculator::Operate(long a,char op,long b){
switch(op){
case '+' :
return (a+b);
case '-' :
return (a-b);
case '*' :
return (a*b);
case '/' :
return (a/b);
}
} //Operate()
/************************************************************/
/* */
/* 简单计算器的测试程序 */
/* */
/************************************************************/
#include"Calculator.cpp"
#include<iostream.h>
void main(){
Calculator expression;
expression.Cal();
cout<<endl;
}
Top
4 楼freefalcon(心宇—消失中...)回复于 2004-11-02 19:46:54 得分 10
template<class exam>
void main(){
@_@
main都被你模板化了,不知楼主怎么考虑的
将这个函数重命名,然后在main里调用该函数的一个实例Top
5 楼xMars(火星虫:最简单的人工智能)回复于 2004-11-02 20:15:28 得分 0
我把搂住的程序改了一下,编译没问题了,好像执行后结果不对
#include<iostream.h>
#include"stdio.h"
#include"malloc.h"
#define STACK_INIT_SIZE 100;
#define STACKINCRMENT 10;
///////////////////////////////////////////////////////////////////////////////
template<class exam>class stack{
private:
exam * base;
exam * top;
int stacksize;
public:
stack();
exam Gettop(){ if(top == base) cout<<"ERROR"<<endl; return *(top-1); }
void push(exam e);
exam pop();
};///////////////////////////////////////////////////////////////////////////
template<class exam>
stack<exam>::stack(){
//构造一个空的栈
base = (exam *) malloc(100 * sizeof(exam));
if(!base) cout << "ERROR"<<endl;
top = base;
stacksize = STACK_INIT_SIZE;
}/////////////////////////////////////////////////////////////////////////
template<class exam>
void stack<exam>::push(exam e){
//插入E为新的元素
if(top - base >= stacksize){//栈满。追加存储空间
base = (exam *) realloc (base,(stacksize + 10)*sizeof(exam));
if(!base) cout << "ERROR"<<endl;
top = base + stacksize;
stacksize += STACKINCRMENT;
}
* top++ = e;
}//push
template<class exam>
exam stack<exam>::pop(){
//若栈不空,则删除栈顶元素,并返回;
// 否则返回 ERROR
if(top == base) cout << "ERROR"<<endl;
return * --top;
}
////////////////////////////////////////////////////////////////////////
char Precede(char a,char b){
switch(a){
case '+':
case '-':
switch(b){
case '+':
case '-':
case ')':
case '#':
return '>';break;
case '*':
case '/':
case '(':
return '<';break;
}
case '*':
case '/':
if( b =='(' ) return '<';
else return '>';
break;
case '('://假设#不会出现
if( b ==')' ) return '=';
else return '<';
break;
case ')'://假设(不会出现
return '>'; break;
case '#'://假设)不会出现
if( b== '#' ) return '=';
else return '<';
break;
}
return 0;
}//////////////////////////////////////////////
int Operate(int aa,char temp,int bb){
switch(temp){
case '+': return (aa + bb);break;
case '-': return (aa - bb);break;
case '/':
return (aa / bb);break;
case '*': return (aa * bb);break;
}
return -1;
}
void main(){
//算术表达式求值优先算法。设OPTR和OPND分别为运算符栈和运算数栈,
stack<char> OPTR;
stack<int> OPND;
OPTR.push('#');
cout << "请输入表达式并以“#”开始和结束:"<<endl;
int c =getchar();
char temp;
int aa,bb;
while(c != '#' || OPTR.Gettop() !='#'){
if(sizeof(c)>1) { OPND.push(c);c = getchar();} //不是运算符则进栈
else
switch(Precede(OPTR.Gettop(),c)){
case '<': //栈顶元素优先级低
OPTR.push(c); c = getchar();
break;
case '=': //脱括号并接收下一字符
OPTR.pop(); c = getchar();
break;
case '>': //退栈并把运算结果入栈
temp = OPTR.pop();
bb = OPND.pop() ;
aa = OPND.pop() ;
OPND.push(Operate(aa,temp,bb));
break;
}
}
cout << "结果为:"<<endl;
cout <<OPND.pop()<<endl;
}
Top
6 楼xMars(火星虫:最简单的人工智能)回复于 2004-11-02 20:16:12 得分 0
揭帖so快
呵呵Top




