C++语言如何将字符串转换成算式计算,例如字符串“1+(2+3)*4”,如何得到21

 我来答
ustb_hxb
2014-04-30 · TA获得超过265个赞
知道小有建树答主
回答量:248
采纳率:66%
帮助的人:169万
展开全部
利用栈可以解决该问题:

#include <stdio.h>
#include <malloc.h>
#define maxsize 256
typedef struct
{
char data[maxsize];
int top;
}sqstack,*sqlink;
float postcount(char post[]) ;
void Mid_post(char E[],char post[]);
void Push(sqlink s,char x);
void Clearstack(sqlink s);
int Precede(char x,char y);
int Emptystack(sqlink s);
char Getstop(sqlink s);
char Pop(sqlink s);
void main()
{ char post[256],E[256];
int i=0;
while(i!=100)
{
printf("请输入表达式输入“#”结束\n");
scanf("%s",E);
Mid_post(E,post);
}
}

void Clearstack(sqlink s)
{
s->top=-1;
}
int Emptystack(sqlink s)
{
if(s->top<0) return(1);
else return(0);
}
char Getstop(sqlink s)
{
if(Emptystack(s)) return NULL;
else return(s->data[s->top]);
}
void Push(sqlink s,char x)
{
if(s->top>=maxsize-1) ;
else
{
s->top++;
s->data[s->top] = x;
}
}
char Pop(sqlink s)
{
if(Emptystack(s)) return(NULL);
else
{
s->top--;
return(s->data[s->top+1]);
}
}
int Precede(char x,char y)
{
switch(x)
{ case '#' :x=0;break;
case '(' :x=1;break;
case '+' :x=2;break;
case '-' :x=2;break;
case '*' :x=3;break;
case '/' :x=3;break;
}
switch(y)
{ case '#' :y=0;break;
case '+' :y=2;break;
case '-' :y=2;break;
case '*' :y=3;break;
case '/' :y=3;break;
case '(' :y=4;break;
}
if(x>=y) return(1);
else return(0);
}
void Mid_post(char E[],char post[])
{
int i=0,j=0;
char x;
sqlink s;
s=(sqlink)malloc(sizeof(sqstack));
Clearstack(s);
Push(s,'#');
do{
x=E[i++];
switch(x)
{
case '#' :
{
while(!Emptystack(s))
{post[j++]=Pop(s);}
}break;
case ')' :
{
while(Getstop(s)!='(')
{post[j++]=Pop(s);}
Pop(s);
}break;
case '+':
case '-':
case '*':
case '/':
case '(':
{
while(Precede(Getstop(s), x))
{post[j++]=Pop(s);}
Push(s,x);
}break;
default : post[j++]=x;
}
}while(x!='#');
for(i=0;i<=j;i++)
printf("%c",post[i]);
printf("\n%f\n",postcount(post));
}
float postcount(char post[])
{
int i=0;
char x;
float z,a,b;
sqlink s;
s=(sqlink)malloc(sizeof(sqstack));
Clearstack(s);
while(post[i]!='#')
{
x=post[i];
switch(x) { case '+': {b=(float)Pop(s);a=(float)Pop(s); z=a+b; Push(s,z); break;}
case '-': {b=(float)Pop(s);a=(float)Pop(s); z=a-b; Push(s,z); break;}
case '*': {b=(float)Pop(s);a=(float)Pop(s); z=a*b; Push(s,z); break;}
case '/': {b=(float)Pop(s);a=(float)Pop(s); z=a/b; Push(s,z); break;}
default : {x=post[i]-'0'; Push(s,x);}
}
i++ ;
}
if(!Emptystack(s)) return(Getstop(s));

}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式