表达式求值调试完成
来源:互联网 发布:86版西游记知乎 编辑:程序博客网 时间:2024/05/16 15:22
原来调试程序比写程序难多了!
花了不到2个小时写完的程序,调试花了我快4个小时,还有很多不完美,下一不是让程序支持二位数的运算!
调试过程我也就不想写了,太辛苦了!
下面是我修改的结果
哎~·最近又要和字符串打交道了!
/**********************************************************
本算法采用的是“运算符号优先法”
用来对给定的表达式求值的过程
目前版本1.00!------NavyBlueStudio
**********************************************************/
///////////////////////////////////////////////////////////////////
#include<iostream>
//#include<wingdi.h>
//定义栈的数据类型
#define ADDSIZE 10
#define ERROR 0
#define FALSE 0
#define OVERFLOW 0
#define TRUE 1
typedef struct
{
char *top;//指向栈顶的指针
char *base;//指向栈底的指针
int StackSize;//定义栈的大小
} Stack;
//栈的基本操作
void InitStack(Stack &);//初始化栈操作
void push(Stack&,char);//压栈
char GetTop(Stack);//得到栈顶元素
void Pop(Stack&,char&);
int Compare(char);
char Operate(char,char,char);
char Precede(char,char);
/////////////////////////////////////////////////////////////////////////////////////////
//实现部分
/////////////////////////////////////////////////////////////////////////////////////////
//EvaluateExpression函数主要完成表达式求值问题
//Expression是要求值的表达式传递的值
int EvaluateExpression(char* Expression)
{
//用OPTR来保存操作符,OPND来保存
Stack OPTR,OPND;
InitStack(OPTR);
push(OPTR,'#');//#符号表示栈底
InitStack(OPND);
//定义temp来保存临时的符号或操作数
char temp;
int i=0;
temp=Expression[i];
//判断如果是 ##那么结束循环
while(GetTop(OPTR)!='#'||temp!='#')
{
//Compare是用来比较是操作数还是操作符的如果是操作数返回TRUE如果是操作符返回FALSE
if(Compare(temp))
{
push(OPND,temp);
temp=Expression[++i];
}
else
//Precede用来比较栈顶操作符和新的操作符的优先级
switch(Precede(GetTop(OPTR),temp))
{
case '<'://栈顶的优先级低
push(OPTR,temp);
temp=Expression[++i];
break;
case '='://脱括号过程并接受下一个字符
char x;
Pop(OPTR,x);
temp=Expression[++i];
break;
case '>'://退栈并将运算结果载入栈
char Sign;
char Num1,Num2;
Pop(OPTR,Sign);
Pop(OPND,Num1);
Pop(OPND,Num2);
push(OPND,Operate(Num1,Sign,Num2));//找到问题了,要把数字转换为字符形式
break;
}
}
return GetTop(OPND);
}
int Compare(char IsOperatorNum)
{
//比较是否是操作数。。前提是操作数在0到12的范围内
//如果不在这个范围内的一律当运算符来看待
if((IsOperatorNum-48)>=0&&(IsOperatorNum-48)<=12)
{
return TRUE;
}
else
return FALSE;
}
char Operate(char num1,char sign,char num2)
{
//注意要返回字符型的
//先转换为数值型 再转换为字符行返回
int integer1,integer2;
integer1=num1-48;
integer2=num2-48;
if('+'==sign)
return (integer1+integer2)+48;
else if('-'==sign)
return (integer1-integer2)+48;
else if('*'==sign)
return integer1*integer2+48;
else
return integer1/integer2+48;
}
//比较运算符的优先级别 这步比较麻烦罗嗦
char Precede(char sign1,char sign2)
{
switch(sign1)
{
case '+':
case '-':
switch(sign2)
{
case '+':
case '-':
case ')':
case'#':
return '>';
case '*':
case '/':
case '(':
return '<';
}
case '*':
case '/':
switch(sign2)
{
case '+':
case '-':
case '*':
case '/':
case ')':
case '#':
return '>';
case '(':
return '<';
}
case '(':
switch(sign2)
{
case ')':
return '=';
default:
return '<';
}
case ')':
return '>';
case '#':
switch(sign2)
{
case '#':
return '=';
default:
return '<';
}
}
}
void InitStack(Stack &s)
{
//到时候注意点
s.base=(char*)malloc(16*sizeof(char));
if(!(s.base))exit(OVERFLOW);//分配失败
s.top=s.base;//栈顶为空
s.StackSize=16;
}
void push(Stack &s,char sign)
{
//开始判断栈是否满了
if((s.top-s.base)>=s.StackSize)
{
//如果满了 追加存储空间
s.base=(char*)realloc(s.base,(s.StackSize+ADDSIZE)*sizeof(char));
if(!(s.base))
exit(OVERFLOW);
s.top=s.base+s.StackSize;
s.StackSize+=ADDSIZE;
}
*(s.top++)=sign;
}
char GetTop(Stack s)
{
//判断栈是否为空
if(s.base==s.top)
return 0;
char ch;//ch是用来保存
ch=*(s.top-1);//这里有问题 晚上来调试了 别把我的给搞乱了
return ch;
}
void Pop(Stack& s,char &receive)
{
if(s.top==s.base)
exit(0);
receive=*(s.top-1);
s.top--;
}
int main()
{
//测试程序 由于本程序采用的是字符串形式的栈 故而不不能存放大于二位数的值
//所以再一次计算中要是出现二位数的数值那么结果将会出现错误
//明天来改进一下,采用字符数组的形式或双字符串的大小来存放元素
char* temp="1*(2+4)*2#";
char m=EvaluateExpression(temp);
int j=m-48;
std::cout<<"您要求的表达式的值为:"<<j<<std::endl;
return 0;
}
/////////////////////////////////////////////////////////////////////////////////////////
- 表达式求值调试完成
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- Item 22. 模板方法与曲线救国(Template Method)
- JavaScript 对象与数组参考大全
- 利用Eclipse编译
- 浮生萧条[不错的校园故事]
- 买房注意的9点
- 表达式求值调试完成
- [转贴]职业规划
- JUnit 之走马观花篇
- SMS,EMS PDU Code Decoder 短信PDU格式解码器
- 另类的三国趣事
- C#WinForm程序打包
- 嵌入式设备上的 Linux 系统开发
- 管理的最高境界不是完美
- WEB 技术模拟应用程序