新手写的四则运算,觉得效率不怎么样,哪位有耐心的大大可以提点意见~

KID_coder 2010-02-09 02:42:10

//MainFile
#include <iostream>
#include "MyCalculator.h"
#include "MyCalculator.cpp"
using namespace std;
void main()
{
Operand *TopNum,*BaseNum; //初始化栈顶和栈底
TopNum = new Operand;
BaseNum = new Operand;
TopNum->next = BaseNum->next = NULL;
TopNum = BaseNum;
Operator *TopOpera,*BaseOpera;
TopOpera = new Operator;
BaseOpera = new Operator;
TopOpera->next = BaseOpera->next = NULL;
TopOpera->Opera = BaseOpera->Opera = '!';
TopOpera = BaseOpera;
Welcome();

char ch,Opera,OpOpera;
int num,Value,TValue1,TValue2;
ch = getchar();
while(ch != '\n')
{
if (isdigit(ch))
{
ungetc(ch,stdin);
scanf("%d",&num);
PushNum(TopNum,num);
}
else
{
if((ch == ')' ||ch == '}' || ch == ']'))
{
switch(ch)
{
case ')' : OpOpera = '(';break;
case ']' : OpOpera = '[';break;
case '}' : OpOpera = '{';break;
default : cout << "程序出现错误!\n";exit(1);
}
while(OpOpera != TopOpera->Opera)
{
Opera = PopOpera(TopOpera);
TValue1 = PopNum(TopNum);
TValue2 = PopNum(TopNum);
Value = Calculator(TValue1,TValue2,Opera);
PushNum(TopNum,Value);
}
Opera = PopOpera(TopOpera);
}
else
{
switch(Compare(TopOpera->Opera,ch))
{
case '>' : TValue1 = PopNum(TopNum);
TValue2 = PopNum(TopNum);
Opera = PopOpera(TopOpera);
Value = Calculator(TValue1,TValue2,Opera);
PushNum(TopNum,Value);
PushOpera(TopOpera,ch);break;
case '<' : PushOpera(TopOpera, ch);break;
// case '=' : ch = PopOpera(TopOpera);break;
// case '@' : cout << "!!!!!!!!!!!!";break;
default : cout << "compare函数错误,请检查是否输入正确。\n";break;//exit(1);
}
}

}

ch = getchar();

}
while(TopOpera->Opera != '!')
{
Opera = PopOpera(TopOpera);
TValue1 = PopNum(TopNum);
TValue2 = PopNum(TopNum);
Value = Calculator(TValue1,TValue2,Opera);
PushNum(TopNum,Value);
}
cout << ">> 计算所得结果是:"<< Value << endl;
}


//MyCalculator.h
#ifndef MyMATH_H
#define MyMATH_H
class Operand //操作数类
{

public :
int num;
Operand (){};
Operand (int num) {this->num = num;}
Operand *next;
friend void PushNum(Operand * &Top,int Num);
friend int PopNum(Operand * &Top);
};

class Operator //操作符类(运算符类)
{
public :
char Opera;
Operator(){}
Operator(char Opera){this->Opera = Opera;}
Operator *next;
friend void PushOpera(Operator *&,char);
friend char PopOpera(Operator *&);
};

void Welcome(); //欢迎界面
//void GetExp(); //获取用户输入的表达式
char Compare(char token1,char token2); //比较运算符的优先级
int Calculator (int Num1,int Num2,char Opera);

#endif


//MyCalculator.cpp
#ifndef MyMATHH_H_
#define MyMATHH_H_
#include <iostream>
using namespace std;
void PushNum(Operand * &Top,int NewNum) //数字进栈操作!
{
Operand *NewOperand;
NewOperand = new Operand;
NewOperand->num = NewNum;
NewOperand->next = Top;
Top = NewOperand;
}
int PopNum(Operand * &Top )
{
int temp;
Operand *NewTop; //pop出之后,定义一个新的栈顶
temp = Top->num;
NewTop = Top->next;
delete Top;
Top = NewTop;
return temp;
}
void PushOpera(Operator * &Top,char NewOpera)
{
Operator *NewTop;
NewTop = new Operator;
NewTop->Opera = NewOpera;
NewTop->next = Top;
Top = NewTop;
}
char PopOpera(Operator * &Top)
{
char temp;
temp = Top->Opera;
Operator *NewTop;
NewTop = Top->next;
delete Top;
Top = NewTop;
return temp;
}
char Compare(char token1,char token2) //compare 函数比较优先级
{
char ReValue;
if ( token1 == '+' || '-' == token1 ) //比较优先级,判断运算先后
{
switch (token2)
{
case '+' :
case '-' : ReValue = '>';break; //加和减的优先级相同!
case '*' :
case '/' :
case '(' :
case '[' :
case '{' : ReValue = '<';break;
default : break;
}
}
else if (token1 == '*' || token1 == '/' )
{
switch (token2)
{
case '+' :
case '-' :
case '*' :
case '/' :ReValue = '>';break;
case '(' :
case '[' :
case '{' : ReValue = '<';break;
default : ReValue = '#';break;
}
}
else if (token1 == '(' || token1 == '[' || token1 == '{' )
{
ReValue = '<'; //遇到左括号,进栈操作~
}

else if (token1 == '!' )
{

ReValue = '<'; //栈中无元素~~进栈!
}
else
ReValue = '#';
return ReValue;
}
void Welcome()
{
char line1[] = "\n\n\n\n\t\t\t 欢迎使用本计算器\n";
char line2[] = "\t\t==========================================\n";
int i(0);
while(line1[i] != '\0')
{
_sleep(30);
putchar(line1[i++]);
}
i = 0;
while(line2[i] != '\0')
{
_sleep(30);
putchar(line2[i++]);
}
cout << "\t\t请输入要计算的表达式,如4*(4+3),然后回车结束\n\t\t\t\t\t\t(KID制作,测试版) \n";
cout << "\t\t==========================================\n";
}

int Calculator (int Num2,int Num1,char Opera) //注意次序~~Num1是前一个数,Num2是后一个数!
{
int result;
switch(Opera)
{
case '+' : result = Num1 + Num2;break;
case '-' : result = Num1 - Num2;break;
case '*' : result = Num1 * Num2;break;
case '/' : result = Num1 / Num2; break;
default : cout << "Calculator函数错误,请检查是否输入正确.\n";break;//exit(1);
}
return result;
}
#endif
...全文
148 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
brucest0078 2010-02-11
  • 打赏
  • 举报
回复
用算符优先算法把。。。做一个operator 优先级矩阵表,然后在比较进出栈计算,
编译原理里面还有其他的
cpio 2010-02-10
  • 打赏
  • 举报
回复
if((ch == ')' ||ch == '}' || ch == ']'))
{
switch(ch)
{
case ')' : OpOpera = '(';break;
case ']' : OpOpera = '[';break;
case '}' : OpOpera = '{';break;
default : cout << "程序出现错误!\n";exit(1);
}


这儿default后面的内容有没有意义啊?
V68V6 2010-02-09
  • 打赏
  • 举报
回复
看看大话设计模式

第一篇就是讲一个四则计算器的设计和优化问题

你说的效率是指代码冗余
sagegz 2010-02-09
  • 打赏
  • 举报
回复
LZ首先你自己觉得哪的效率不高呢?
KID_coder 2010-02-09
  • 打赏
  • 举报
回复
我也说不清~~就是代码量太大了~
判断语句多了~

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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