ACM 问题 http://acm.swjtu.edu.cn/JudgeOnline/showproblem?problem_id=1500 我的程序为什么错了
#include<iostream.h>#include<cstdio>//#defineMaxLen10000//存储空间inttran(charstr[],chare...
#include<iostream.h>
#include<cstdio>
//#define MaxLen 10000//存储空间
int tran(char str[], char expr[]) //将中缀表达式转换成后缀表达式 if(tran(str,expr)==0)//原来表达式,后缀表达式
{
int st[10000]; //转化过程使用的过度栈
char ch;
int i=0,exindex=0,stindex=-1; //i是str下标,exindex是expr下标,stindex是st下标
while((ch=str[i++])!='\0')
{
if(ch==' ')
continue; //什么也不做
if(ch>='0' && ch<='9') //判断是数字
{
expr[exindex]=ch; //压栈
exindex++; //栈顶指针上移
while((ch=str[i++])!='\0' && ch>='0' && ch<='9') //其它位依次入栈
{
expr[exindex]=ch;
exindex++;
}
i--; //str原算术表达式栈向下遍历
expr[exindex]='\n'; //以特殊字符“\n”表示结束
exindex++;
}
else if(ch=='(') //判断为左括号
{
stindex++;
st[stindex]=ch;
}
else if(ch==')') //判断为右括号
{
while (st[stindex]!='(')
{
expr[exindex]=st[stindex];
stindex--; //依次弹出
exindex++;
}
stindex--;//'('出栈
}
else if(ch=='+' || ch=='-')//判断为加减号
{
while(stindex>=0 && st[stindex]!='(')
{
expr[exindex]=st[stindex];
stindex--;
exindex++;
}
stindex++;
st[stindex]=ch;
}
else if (ch=='*' || ch=='/')//判断为乘除号
{
while(st[stindex]=='*' || st[stindex]=='/')
{
expr[exindex]=st[stindex];
stindex--;
exindex++;
}
stindex++;
st[stindex]=ch;
}
}
while (stindex>=0)//将栈中所有运算符依次弹出存入expr栈中
{
expr[exindex]=st[stindex];
exindex++;
stindex--;
}
expr[exindex]='\0';
return 1;
}
int compvalue(char expr[],int *n)
{
int st[100],d; //st为数栈
char ch;
int exindex=0,stindex=-1; //exindex是expr下标,stindex是st的下标
while((ch=expr[exindex++])!='\0')
{
if(ch>='0'&&ch<='9')//将数字字符转换成数字
{
d=0;
do
{
d=10*d+ch-'0';
}
while((ch=expr[exindex++])!='\n');
stindex++;
st[stindex]=d;//数字进栈
}
else//运算符操作
{
switch(ch)
{
case ' ':
; //什么也不做
case'+':
st[stindex-1]=st[stindex-1]+st[stindex]; break;
case'-':
st[stindex-1]=st[stindex-1]-st[stindex]; break;
case'*':
st[stindex-1]=st[stindex-1]*st[stindex]; break;
case'/':
if(st[stindex]!=0)
{ st[stindex-1]=st[stindex-1]/st[stindex]; }
else
return 0; //除0错误!
break;
}
stindex--;
}
}
(*n)=st[stindex];
return 1;
}
int main()
{
int t;
char str[10000]; //存储原来算术表达式
char expr[10000]; //存储转换成的后缀表达式
int n;
cin>>t;
// getchar();
while(t--)
{
gets(str);
if(tran(str,expr)==0)
{
cout<<"原算术表达式不正确!"<<endl;
}
else
{
// cout<<"转换成后缀表达式输出:"<<endl<<expr<<endl;
if(compvalue(expr,&n)==1)
{
// cout<<"表达式求值:"<<endl<<n<<endl;
cout<<n<<endl;
}
else
{
cout<<"计算错误!"<<endl;
}
}
}
return 0;
} 展开
#include<cstdio>
//#define MaxLen 10000//存储空间
int tran(char str[], char expr[]) //将中缀表达式转换成后缀表达式 if(tran(str,expr)==0)//原来表达式,后缀表达式
{
int st[10000]; //转化过程使用的过度栈
char ch;
int i=0,exindex=0,stindex=-1; //i是str下标,exindex是expr下标,stindex是st下标
while((ch=str[i++])!='\0')
{
if(ch==' ')
continue; //什么也不做
if(ch>='0' && ch<='9') //判断是数字
{
expr[exindex]=ch; //压栈
exindex++; //栈顶指针上移
while((ch=str[i++])!='\0' && ch>='0' && ch<='9') //其它位依次入栈
{
expr[exindex]=ch;
exindex++;
}
i--; //str原算术表达式栈向下遍历
expr[exindex]='\n'; //以特殊字符“\n”表示结束
exindex++;
}
else if(ch=='(') //判断为左括号
{
stindex++;
st[stindex]=ch;
}
else if(ch==')') //判断为右括号
{
while (st[stindex]!='(')
{
expr[exindex]=st[stindex];
stindex--; //依次弹出
exindex++;
}
stindex--;//'('出栈
}
else if(ch=='+' || ch=='-')//判断为加减号
{
while(stindex>=0 && st[stindex]!='(')
{
expr[exindex]=st[stindex];
stindex--;
exindex++;
}
stindex++;
st[stindex]=ch;
}
else if (ch=='*' || ch=='/')//判断为乘除号
{
while(st[stindex]=='*' || st[stindex]=='/')
{
expr[exindex]=st[stindex];
stindex--;
exindex++;
}
stindex++;
st[stindex]=ch;
}
}
while (stindex>=0)//将栈中所有运算符依次弹出存入expr栈中
{
expr[exindex]=st[stindex];
exindex++;
stindex--;
}
expr[exindex]='\0';
return 1;
}
int compvalue(char expr[],int *n)
{
int st[100],d; //st为数栈
char ch;
int exindex=0,stindex=-1; //exindex是expr下标,stindex是st的下标
while((ch=expr[exindex++])!='\0')
{
if(ch>='0'&&ch<='9')//将数字字符转换成数字
{
d=0;
do
{
d=10*d+ch-'0';
}
while((ch=expr[exindex++])!='\n');
stindex++;
st[stindex]=d;//数字进栈
}
else//运算符操作
{
switch(ch)
{
case ' ':
; //什么也不做
case'+':
st[stindex-1]=st[stindex-1]+st[stindex]; break;
case'-':
st[stindex-1]=st[stindex-1]-st[stindex]; break;
case'*':
st[stindex-1]=st[stindex-1]*st[stindex]; break;
case'/':
if(st[stindex]!=0)
{ st[stindex-1]=st[stindex-1]/st[stindex]; }
else
return 0; //除0错误!
break;
}
stindex--;
}
}
(*n)=st[stindex];
return 1;
}
int main()
{
int t;
char str[10000]; //存储原来算术表达式
char expr[10000]; //存储转换成的后缀表达式
int n;
cin>>t;
// getchar();
while(t--)
{
gets(str);
if(tran(str,expr)==0)
{
cout<<"原算术表达式不正确!"<<endl;
}
else
{
// cout<<"转换成后缀表达式输出:"<<endl<<expr<<endl;
if(compvalue(expr,&n)==1)
{
// cout<<"表达式求值:"<<endl<<n<<endl;
cout<<n<<endl;
}
else
{
cout<<"计算错误!"<<endl;
}
}
}
return 0;
} 展开
1个回答
展开全部
#include <stdio.h>
int main(){
int t;
double a[1000];
char op[1000];
scanf("%d",&t);
while(t--){
int n,m,i;
char ch;
n=0;
m=0;
scanf("%lf",&a[n++]);
double k = a[0];
while(1){
ch = getchar();
if(ch == '\n') break;
ch = getchar();
if(ch == '+' || ch == '-') {op[m++] = ch;
getchar();
scanf("%lf",&a[n++]);
k = a[n-1];
}
else
if(ch == '/' || ch == '*') {
double kk;
getchar();
scanf("%lf",&kk);
if(ch == '/') a[n-1] = k/kk;
else
a[n-1] = k*kk;
k = a[n-1];
}
}
double ans=a[0];
int j =0;
// for(i=0;i<n;i++) printf("%lf \n",a[i]);
// for(i=0;i<m;i++) printf("%c",op[i]);
// printf("\n");
for(i=1;i<n;i++)
{if(op[j]=='+') ans +=a[i];
else
ans -=a[i];
j++;
}
if(ans < 1 ) ans = 0;
printf("%.0lf\n",ans);
}
return 0;
}
N久以前写很挫的代码。自己看把
还有。不能用int
要用double
1/2 + 1/2
用int 是0
答案应该是
1
int main(){
int t;
double a[1000];
char op[1000];
scanf("%d",&t);
while(t--){
int n,m,i;
char ch;
n=0;
m=0;
scanf("%lf",&a[n++]);
double k = a[0];
while(1){
ch = getchar();
if(ch == '\n') break;
ch = getchar();
if(ch == '+' || ch == '-') {op[m++] = ch;
getchar();
scanf("%lf",&a[n++]);
k = a[n-1];
}
else
if(ch == '/' || ch == '*') {
double kk;
getchar();
scanf("%lf",&kk);
if(ch == '/') a[n-1] = k/kk;
else
a[n-1] = k*kk;
k = a[n-1];
}
}
double ans=a[0];
int j =0;
// for(i=0;i<n;i++) printf("%lf \n",a[i]);
// for(i=0;i<m;i++) printf("%c",op[i]);
// printf("\n");
for(i=1;i<n;i++)
{if(op[j]=='+') ans +=a[i];
else
ans -=a[i];
j++;
}
if(ans < 1 ) ans = 0;
printf("%.0lf\n",ans);
}
return 0;
}
N久以前写很挫的代码。自己看把
还有。不能用int
要用double
1/2 + 1/2
用int 是0
答案应该是
1
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询