//悲剧,竟然有bug..调试中。。。通过。。
//暂时不能计算小数的!
【DEBUG前】//计算一个算术表达式,以#结束,如图,例如:
【DEBUG前】
#include <iostream.h>
#include <stdio.h>
#include <math.h>
const int size=20;
int D[20],sum=0,i,j,k; //66行if语句用
class Opnd //数栈
{
public:
int size;
int *base;
int *top;
};
class Optr //符号栈
{
public:
int size;
char *base;
char *top;
};
char precede(char top,char cc) //优先级比较函数,这个函数花了我好长时间,一点点的调试出来的,真的好累。
{
if(top=='(' && cc==')')
return '=';
else if(top=='#'||top=='('||top>cc && cc !='#'&&cc!=')')
return '<';
else if(cc=='#'||cc==')'||top<cc||top==cc)
return '>';
}
int oprator(int a,char b,int c) //运算函数
{
switch(b)
{
case '+': return a+c;
case '-': return a-c;
case '*': return a*c;
case '/': return a/c;
}
}
int main()
{
Opnd pnd;
Optr prt;
char c;
pnd.base=new(int[size]);
prt.base=new(char[size]);
pnd.top=pnd.base;
prt.top=prt.base;
*prt.top='#';
c=getchar();
while(c !='#'||*prt.top !='#')
{
if(c>='0'&& c<='9')
{
for(i=0;c>='0'&& c<='9';i++)
{
D[i]=c-48; //将例如"123"这样的字符串转换成整数123
c=getchar();
}
for(j=0,k=i,sum=0;j<i;j++)
{
sum+=D[j]*pow(10,--k);
}
*pnd.top=sum;
pnd.top++;
}
else
switch(precede(*prt.top,c))
{
case '<': //当前算术符号优先级小于符号栈顶,进符号栈
*(prt.top+1)=c;
prt.top++;
c=getchar();
break;
case '=': //'='只是指当'('遇到')',这个语句块用来消去括号
prt.top--;
c=getchar();
break;
case '>': //当前算术符号优先级大于符号栈顶,取符号栈顶元素
//并取数栈中的最上两个元素进行运算
*(pnd.top-2)=oprator(*(pnd.top-2),*prt.top,*(pnd.top-1));
pnd.top--;
prt.top--;
break;
}
}
cout<<*(pnd.top-1)<<endl;
return 0;
}
【DEBUG后】
#include <iostream.h>
#include <stdio.h>
#include <math.h>
const int size=20;
int D[20],sum=0,i,j,k; //66行if语句用
class Opnd //数栈
{
public:
int size;
int *base;
int *top;
};
class Optr //符号栈
{
public:
int size;
char *base;
char *top;
};
char precede(char top,char cc) //优先级比较函数,这个函数花了我好长时间,一点点的调试出来的,真的好累。
{
/*if(top=='(' && cc==')')
return '=';
else if(top=='#'||top=='('||top>cc && cc !='#'&&cc!=')'||top<cc&&cc=='/') //这部分被注释的是先前写的存在着错误
//不想找错误了,所以写了下面的新的
return '<'; //虽然看着比较长但还是很容易能看懂的
else if(cc=='#'||cc==')'||top<cc&&cc!='/'||top==cc)
return '>';*/
if(top=='(' && cc==')') //判断左右括弧
return '=';
if((top=='+'||top=='-')&&(cc=='*'||cc=='/')) //栈顶操作符优先级低
return '<';
if((cc=='+'||cc=='-')&&(top=='*'||top=='/')) //栈顶操作符优先级高
return '>';
if((cc=='+'||cc=='-')&&(top=='+'||top=='-')) //这两个语句判断'+''-''*''/'
return '>';
if((cc=='*'||cc=='/')&&(top=='*'||top=='/')) //优先级相等的情况
return '>';
if(top=='#'||top=='('||cc=='(') //继续插入cc操作符
return '<';
if(cc=='#'||cc==')'||top==')') //继续运算
return '>';
else
return 'r';
}
int oprator(int a,char b,int c) //运算函数
{
switch(b)
{
case '+': return a+c;
case '-': return a-c;
case '*': return a*c;
case '/': return a/c;
}
}
int main()
{
Opnd pnd;
Optr prt;
char c;
pnd.base=new(int[size]);
prt.base=new(char[size]);
pnd.top=pnd.base;
prt.top=prt.base;
*prt.top='#';
c=getchar();
while(c !='#'||*prt.top !='#')
{
if(c>='0'&& c<='9')
{
for(i=0;c>='0'&& c<='9';i++)
{
D[i]=c-48; //将例如"123"这样的字符串转换成整数123
c=getchar();
}
for(j=0,k=i,sum=0;j<i;j++)
{
sum+=D[j]*pow(10,--k);
}
*(pnd.top++)=sum;
}
else
switch(precede(*prt.top,c))
{
case '<': //当前算术符号优先级小于符号栈顶,进符号栈
*(++prt.top)=c;
c=getchar();
break;
case '=': //'='只是指当'('遇到')',这个语句块用来消去括号
prt.top--;
c=getchar();
break;
case '>': //当前算术符号优先级大于符号栈顶,取符号栈顶元素
//并取数栈中的最上两个元素进行运算
*(pnd.top-2)=oprator(*(pnd.top-2),*prt.top,*(pnd.top-1));
pnd.top--;
prt.top--;
break;
}
}
cout<<*(pnd.top-1)<<endl;
return 0;
}
【修改版】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | /*
*完成时间: 2013年05月24日 星期五 12时42分52秒
*环境: Linux(ubuntu12.04版)
*编译器: gcc (版本 4.6.3)
*作者: 不辞远
*功能: 简单实现,加减乘除(使用编译原理中的递归下降分析法)
*/
#include <stdio.h>
#include <stdlib.h>
char token;
void error( void )
{
printf ( "error!\n" );
exit (1);
}
void match( char expected)
{
if (token == expected) token = getchar ();
else error();
}
int _exp( void ) //exp is gcc reserved word
{
int temp = term();
while (token == '+' || token == '-' ) {
switch (token) {
case '+' :
match( '+' );
temp += term();
break ;
case '-' :
match( '-' );
temp -= term();
break ;
}
}
return temp;
}
int term( void )
{
int temp = factor();
while (token == '*' || token == '/' ) {
switch (token) {
case '*' :
match( '*' );
temp = temp * factor();
break ;
case '/' :
match( '/' );
temp = temp / factor();
break ;
}
}
return temp;
}
int factor( void )
{
int temp;
if (token == '(' ) {
match( '(' );
temp = _exp();
match( ')' );
}
else if (token >= '0' && token <= '9' ) {
ungetc (token,stdin);
scanf ( "%d" ,&temp);
token = getchar ();
}
else
error();
return temp;
}
int main( void )
{
int result;
printf ( "please input the expression:\n" );
token = getchar ();
result = _exp();
if (token == '\n' )
printf ( "the result = %d\n" ,result);
else
error();
return 0;
}
|