现在的位置: 首页 > 综合 > 正文

ACM – 暑期第一天:求任意表达式的值

2013年02月27日 ⁄ 综合 ⁄ 共 1128字 ⁄ 字号 评论关闭


先看题目:

    编程实现计算由键盘输入的任一包含数字和加"+"、减"-"、乘"*"、除"/"及括号"("、")"等运算符的数学表达式。不要求对输入的合法性进行检测,若能对非法表达式判错更佳。

提示:建立两个栈结构,一个用于存储数值和中间运算结果,另一个用于存放操作符。

给出程序代码1:

#include "iostream.h"
const int n=31;
int s1[n]; //操作数栈
char s2[n]; //运算符栈
int t1,t2;
int num[10]; 
void calcu() 
{
	int x1,x2,x;
	char p;
	
	p=s2[t2--];
	
	x2=s1[t1--];
	x1=s1[t1--];
	//进行一次运算
	switch(p) {
		case '+':x=x1+x2;
			break;
		case '-':x=x1-x2;
			break;
		case '*':x=x1*x2;
			break;
		case '/':x=x1/x2;
			break;
	}
	
	s1[++t1]=x;
}
int calculator(char *f)
{
	int v,i = 0;
	char *p = f;
	t1 = t2 = 0; 
	while (*p!='\0')
		switch(*p) {
			case '+': case '-':
				while (t2&&(s2[t2]!='('))
					//执行先遇到的加、减、乘、除运算
					calcu();
				//当前运算符进栈
				s2[++t2] = *p;
				
				p++;
				break;
			case '*': case '/':
				if (t2&&(s2[t2]=='*')||(s2[t2]=='/'))
					//执行先遇到的乘、除运算
					calcu();
				//当前运算符进栈
				s2[++t2]=*p;
				
				p++;
				break;
			case '(':
				//左括号进栈
				s2[++t2]=*p;
				//读下一个字符
				p++;
				break;
			case ')':
				while (s2[t2]!='(')
					//执行括号内的加、减、乘、除运算
					calcu();
				//弹出左括号
				t2--;
				
				p++;
				break;
			default:
				//把字符串转换成整数值
				v=0;
				do {
					v=10*v+*p-'0';
					p++;
				} while((*p>='0')&&(*p<='9'));
				//操作数进栈
				s1[++t1]=v;
				num[i++]=v;
				};
				//执行先遇到的加、减、乘、除运算
				while (t2) 
					calcu();

				return s1[t1];
}
void main()
{
	char a[] = "3-5*(4*13-50)";
	//char a[]="5*(40+6)-39";
	//char a[100];
	//cin >> a;
	cout<<calculator(a)<<endl;
	cout<<"其中的数字为:\n";
	for (int i=0;i<10;i++)
	{	
		cout<<num[i]<<' ';
	}
	cout<<endl;
}



抱歉!评论已关闭.