数据结构的算术表达式!!!
#include"stdio.h"#include"stdlib.h"#include"conio.h"typedefstructnode{chardata;struct...
#include"stdio.h"
#include"stdlib.h"
#include"conio.h"
typedef struct node
{char data;
struct node *next;
}snode,*slink;
int emptystack(slink s)
{if(s==NULL)
return(1);
else
return(0);
}
char pop(slink *top)
{char e;
slink p;
if(emptystack(*top))
return(-1);
else
{e=(*top)->data;
p=*top;
*top=(*top)->next;
free(p);
return(e);
}
}
void push(slink *top,char e)
{slink p;
p=(slink)malloc(sizeof(snode));
p->data=e;
p->next=*top;
*top=p;
}
char gettop(slink s)
{if(s!=NULL)
return(s->data);
return(0);
}
int precede(char x,char y)
{int i=0,j=0;
switch(x)
{case '(':i=1;
break;
case '+':
case '-':i=2;
break;
case '*':
case '/':i=3;
break;
}
switch(y)
{case '+':
case '-':j=2;
break;
case '*':
case '/':j=3;
break;
case '(':j=4;
break;
}
if(i>=j)
return(1);
else
return(0);
}
void mid_post(char mid[],char post[])
{int i=0,j=0;
char x;
slink s=NULL;
push(&s,'#');
do
{x=mid[i++];
switch(x)
{case '#':
{while(!emptystack(s))
post[j++]=pop(&s);
}break;
case ')':
{while(gettop(s)!='(')
post[j++]=pop(&s);
pop(&s);
}break;
case '+':
case '-':
case '*':
case '/':
case '(':
{while(precede(gettop(s),x))
post[j++]=pop(&s);
push(&s,x);
}break;
default:post[j++]=x;
}
}while(x!='#');
}
int postcount(char post[])
{signed int i=0;
char x;
signed float z,a,b;
slink s=NULL;
while(post[i]!='#')
{x=post[i];
switch(x)
{case '+':b=pop(&s)-'0';
a=pop(&s)-'0';
z=a+b+'0';
push(&s,z);
break;
case '_':b=pop(&s)-'0';
a=pop(&s)-'0';
z=a-b+'0';
push(&s,z);
break;
case '*':b=pop(&s)-'0';
a=pop(&s)-'0';
z=a*b+'0';
push(&s,z);
break;
case '/':b=pop(&s)-'0';
a=pop(&s)-'0';
z=a/b+'0';
push(&s,z);
break;
default:
push(&s,x);
}
i++;
}
if(!emptystack(s))
return(gettop(s));
}
main()
{char E[50],post[50],c;
int i;
con: printf("Enter the expression:\n");
scanf("%s",E);
printf("The post expression is:\n");
mid_post(E,post);
printf("%s\n",post);
i=postcount(post)-'0';
printf("The result is:%d\n",i);
printf("Y or N:\n");
fflush(stdin);
scanf("%c",&c);
if(c=='y'||c=='Y')
goto con;
}
无法求负数!!! 展开
#include"stdlib.h"
#include"conio.h"
typedef struct node
{char data;
struct node *next;
}snode,*slink;
int emptystack(slink s)
{if(s==NULL)
return(1);
else
return(0);
}
char pop(slink *top)
{char e;
slink p;
if(emptystack(*top))
return(-1);
else
{e=(*top)->data;
p=*top;
*top=(*top)->next;
free(p);
return(e);
}
}
void push(slink *top,char e)
{slink p;
p=(slink)malloc(sizeof(snode));
p->data=e;
p->next=*top;
*top=p;
}
char gettop(slink s)
{if(s!=NULL)
return(s->data);
return(0);
}
int precede(char x,char y)
{int i=0,j=0;
switch(x)
{case '(':i=1;
break;
case '+':
case '-':i=2;
break;
case '*':
case '/':i=3;
break;
}
switch(y)
{case '+':
case '-':j=2;
break;
case '*':
case '/':j=3;
break;
case '(':j=4;
break;
}
if(i>=j)
return(1);
else
return(0);
}
void mid_post(char mid[],char post[])
{int i=0,j=0;
char x;
slink s=NULL;
push(&s,'#');
do
{x=mid[i++];
switch(x)
{case '#':
{while(!emptystack(s))
post[j++]=pop(&s);
}break;
case ')':
{while(gettop(s)!='(')
post[j++]=pop(&s);
pop(&s);
}break;
case '+':
case '-':
case '*':
case '/':
case '(':
{while(precede(gettop(s),x))
post[j++]=pop(&s);
push(&s,x);
}break;
default:post[j++]=x;
}
}while(x!='#');
}
int postcount(char post[])
{signed int i=0;
char x;
signed float z,a,b;
slink s=NULL;
while(post[i]!='#')
{x=post[i];
switch(x)
{case '+':b=pop(&s)-'0';
a=pop(&s)-'0';
z=a+b+'0';
push(&s,z);
break;
case '_':b=pop(&s)-'0';
a=pop(&s)-'0';
z=a-b+'0';
push(&s,z);
break;
case '*':b=pop(&s)-'0';
a=pop(&s)-'0';
z=a*b+'0';
push(&s,z);
break;
case '/':b=pop(&s)-'0';
a=pop(&s)-'0';
z=a/b+'0';
push(&s,z);
break;
default:
push(&s,x);
}
i++;
}
if(!emptystack(s))
return(gettop(s));
}
main()
{char E[50],post[50],c;
int i;
con: printf("Enter the expression:\n");
scanf("%s",E);
printf("The post expression is:\n");
mid_post(E,post);
printf("%s\n",post);
i=postcount(post)-'0';
printf("The result is:%d\n",i);
printf("Y or N:\n");
fflush(stdin);
scanf("%c",&c);
if(c=='y'||c=='Y')
goto con;
}
无法求负数!!! 展开
展开全部
要写负数的肯定是可以的,不过得考虑到多种情况。
1、如果负数在算术表达式最前面的话,那第一个一定是“-”,这个就是负号。
2、如果是在中间的话,那肯定负数得用()括起来,你可以把它作为一个值存起来,或者比如说(-5),那就可以加入一个0,变成(0-5),把负号当作减号用。这里讨论的是表达式正确的前提,如果不是这两种,说明表达式出错了。感觉还好吧,有了这个思路不是特别难写吧。
这两天没时间, 就不帮你改了。最好自己动手改改。不行的话说一声,等明天晚上再帮你解决。
1、如果负数在算术表达式最前面的话,那第一个一定是“-”,这个就是负号。
2、如果是在中间的话,那肯定负数得用()括起来,你可以把它作为一个值存起来,或者比如说(-5),那就可以加入一个0,变成(0-5),把负号当作减号用。这里讨论的是表达式正确的前提,如果不是这两种,说明表达式出错了。感觉还好吧,有了这个思路不是特别难写吧。
这两天没时间, 就不帮你改了。最好自己动手改改。不行的话说一声,等明天晚上再帮你解决。
彩驰科技
2024-11-22 广告
2024-11-22 广告
互联网算法备案平台,专业代理代办,快速响应,高效办理!专业代理代办,快速办理,让您省时省力!专业团队为您提供优质服务,让您的互联网算法备案更顺利!咨询电话:13426378072,13436528688...
点击进入详情页
本回答由彩驰科技提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询