只有时逆波兰程序还没有问题,改变一下输入程序就无法运行,看了好久没发现问题在哪,痛苦
#include
#include
#include<string.h>
#include
#define selemtype int
void convert( int num[]);
using namespace std;
struct node
{
selemtype data;
struct node next;
};
struct stack
{
struct nodetop;
};
struct stack * createmptystack()
{
struct stack *s;
s=(struct stack *)malloc(sizeof(struct stack));
if(s!=NULL)
{
s->top=NULL;
}
return s;
}
int stackempty(struct stack *s)
{
return s->top==NULL;
}
int push(struct stack *s,selemtype x)
{
struct node * pnew;
pnew=(struct node *)malloc(sizeof(struct node));
if(pnew!=NULL)
{
pnew->data=x;
pnew->next=s->top;
s->top=pnew;
return 1;
}
return 0;
}
selemtype pop(struct stack *s)
{
selemtype x;
struct node *ptemp;
x=s->top->data;
ptemp=s->top;
s->top=s->top->next;
free(ptemp);
return x;
}
selemtype gettop(struct stack s)
{
return s->top->data;
}
int priority(int m,int s)
{
int i;
int a[2],b[2];
a[0]=m;
a[1]=s;
for(i=0;i<2;i++)
{
if(a[i]=='(')
b[i]=0;
else if(a[i]=='+'||a[i]=='-')
b[i]=1;
else if(a[i]=='*'||a[i]=='/')
b[i]=2;
}
if(b[0]-b[1]>=0)
return 1;
else
return 0;
}
void trans(char s1)
{
char s2[1000];
struct stack * s;
s=createmptystack();
int i=0,j=0,m;
push(s,'(');
while(s1[i]!='#')
{
if(s1[i]>='0'&&s1[i]<='9')
{
s2[j++]=s1[i];
if(s1[i+1]<'0'||s1[i+1]>'9')
s2[j++]=' ';
}
else if(s1[i]=='(')
push(s,s1[i]);
else if(s1[i]==')')
{
m=gettop(s);
while(m!='(')
{
m=pop(s);
s2[j++]=m;
m=gettop(s);
}
m=pop(s);
}
else
{
m=gettop(s);
while(priority(m,s1[i]))
{
m=pop(s);
s2[j++]=m;
m=gettop(s);
}
push(s,s1[i]);
}
i++;
}
m=gettop(s);
while(m!='(')
{
m=pop(s);
s2[j++]=m;
m=gettop(s);
}
s2[j]='#';
for(i=0; s2[i]!='#'; i++)
{
s1[i]=s2[i];
}
s1[i]='#';
}
int cal(char * s1)
{
int m,x,y,z,i=0;
struct stack s;
s=createmptystack();
while(s1[i]!='#')
{
if(s1[i]>='0'&&s1[i]<='9')
{
m = 0;
while(s1[i]!=' ')
{
m=m*10+(s1[i]-'0');
i++;
}
push(s,m);
i++;
}
else
{
y=pop(s);
x=pop(s);
if(s1[i]=='+')
z=x+y;
else if(s1[i]=='-')
z=x-y;
else if(s1[i]=='*')
z=x*y;
else if(s1[i]=='/')
z=x/y;
else if(s1[i]=='@')
if(y != 0)
z=y-x;
else if(s1[i]=='!')
if(x != 0)
z=y/x;
push(s,z);
i++;
}
}
return gettop(s);
}
int main()
{
int num[4];
printf("Please input 4 number between 1 to 10, such as 1 2 3 4:\n");
for(int p = 0;p <= 3;p++)
{
scanf("%d",&num[p]);
}
for(int c = 0;c <= 3;c++)
{
if(num[c] < 1 || num[c] > 10)
{
printf("输入的数字不符合规则\n");
return 0;
}
}
convert(num);
return 0;
}
void convert( int num[])
{
char a[24][4];
int i,j,k,m,p,n = 0,x = 0,l;
char ch1,ch2,ch3,s1[9];
double d1,d2,d3;
for(i=0;i<=3;i++){
for(j=0;j<=3;j++){
if(j==i) continue;
for(k=0;k<=3;k++){
if(k==j || k==i) continue;
for(m=0;m<=3;m++){
if(m==k || m==j || m==i) continue;
a[n][0] = num[i];
a[n][1] = num[j];
a[n][2] = num[k];
a[n][3] = num[m];
n++;
}
}
}
}//穷举法,把输入的四个数的24种顺序求出,放置在数组二维a[24][]中
for(n=0;n<=23;n++){//分别考虑各种顺序,一共24种
for(i=0;i<=5;i++){
switch(i){//处理1,2两个数,为了取消括号,简化处理,新增了两种运算@和!
case 0: ch1 = '+'; break;
case 1: ch1 = '-'; break;
case 2: ch1 = ''; break;
case 3: ch1 = '/'; break;
case 4: ch1 = '@'; break;//a@b 表示b-a
case 5: ch1 = '!'; break;//a!b 表示b/a
}
for(j=0;j<=5;j++){
switch(j){//处理第3个数
case 0: ch2 = '+'; break;
case 1: ch2 = '-'; break;
case 2: ch2 = ''; break;
case 3: ch2 = '/'; break;
case 4: ch2 = '@'; break;
case 5: if(d1==0.0) d2 = 10000;
else ch2 = '!'; break;
}
for(k=0;k<=5;k++){
switch(k){//处理第四个数
case 0: ch3 = '+'; break;
case 1: ch3 = '-'; break;
case 2: ch3 = ''; break;
case 3: ch3 = '/'; break;
case 4: ch3 = '@'; break;
case 5: if(d2==0.0) d3 = 10000;
else ch3 = '!'; break;
}
for(l=0;l<=4;l++)
{
switch(l)
{
case 0:s1[0] = '(';
s1[1] = a[n][0];
s1[2] = ch1;
s1[3] = a[n][1];
s1[4] = ')';
s1[5] = ch2;
s1[6] = a[n][2];
s1[7] = ch3;
s1[8] = a[n][3];
s1[9] = '#';
trans(s1);
d3 = cal(s1);
printf("%c%d%c%d%c%c%d%c%d",s1[0],s1[1],s1[2],s1[3],s1[4],s1[5],s1[6],s1[7],s1[8]);
break;
case 1:s1[0] = '(';
s1[1] = a[n][0];
s1[2] = ch1;
s1[3] = a[n][1];
s1[4] = ch2;
s1[5] = a[n][2];
s1[6] = ')';
s1[7] = ch3;
s1[8] = a[n][3];
s1[9] = '#';
trans(s1);
d3 = cal(s1);
break;
case 2:
s1[0] = a[n][0];
s1[1] = ch1;
s1[2] = '(';
s1[3] = a[n][1];
s1[4] = ch2;
s1[5] = a[n][2];
s1[6] = ')';
s1[7] = ch3;
s1[8] = a[n][3];
s1[9] = '#';
trans(s1);
d3 = cal(s1);
break;
case 3:
s1[0] = a[n][0];
s1[1] = ch1;
s1[2] = '(';
s1[3] = a[n][1];
s1[4] = ch2;
s1[5] = a[n][2];;
s1[6] = ch3;
s1[7] = a[n][3];
s1[8] = ')';
s1[9] = '#';
trans(s1);
d3 = cal(s1);
break;
case 4:
s1[0] = a[n][0];
s1[1] = ch1;
s1[2] = a[n][1];
s1[3] = ch2;
s1[4] = '(';
s1[5] = a[n][2];;
s1[6] = ch3;
s1[7] = a[n][3];
s1[8] = ')';
s1[9] = '#';
trans(s1);
d3 = cal(s1);
break;
}
}
//可以输出凑出24的表达式
//if(fabs(d3-24)<=1e-6) return ;
}
}
}//以上实现的运算,