?? hangkongdingpiao.c
字號:
}
int ReturnOpOrd(char op,char* TestOp) {//被char precede(char Aop, char Bop)所調(diào)用來求優(yōu)先級
int i;
for(i=0; i< OPSETSIZE; i++) {
if (op == TestOp[i]) return i;
}
return 0;
}
char precede(char Aop, char Bop) {
return Prior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)];
}
status initstack(sqstack *s){
(s)->base = (int*)malloc(STACK_INIF_SIZE*sizeof(int));
if((s)->base==NULL) exit(OVERFLOW);
(s)->top=(s)->base;
(s)->stacksize = STACK_INIF_SIZE;
// printf("棧初始化完成!\n");
return OK;
}
int gettop(sqstack *s){
int e;
if(s->top==s->base){
printf("棧空,無法取得棧頂元素!\n");
return 0;
}
e=*(s->top-1);
// printf("取得棧頂元素: %d \n",e);
return e;
}
status push(sqstack *s,int e){
if(s->top-s->base>=s->stacksize){
s->base=(int*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(int));
if(!s->base) exit(OVERFLOW);
s->stacksize+= STACKINCREMENT;
}
*(s->top++)=e;
// printf("把 %d 壓棧 is OK\n",e);
return OK;
}
status pop(sqstack *s,int *e){
if(s->top==s->base){
printf("棧空,出棧錯(cuò)誤!\n");
return ERROR;
}
*e=*(--s->top);
// printf(" %d出棧成功 !\n",*e);
return OK;
}
int EvaluateExpression(char* MyExpression) { // 算法3.4
// 算術(shù)表達(dá)式求值的算符優(yōu)先算法。
// 設(shè)OPTR和&&OPND分別為運(yùn)算符棧和運(yùn)算數(shù)棧,OP為運(yùn)算符集合。
int result;
sqstack OPTR; // 運(yùn)算符棧,字符元素
sqstack OPND; // 運(yùn)算數(shù)棧,實(shí)數(shù)元素
int c,bl,a,b,theta,top;
sqlist *q,l;
char *s=MyExpression;
init_sq(&l);
if(chang(s,&l)!=0){
q=&l;
initstack(&OPTR);
push(&OPTR, 35);
initstack (&OPND);
q=q->next;
c=q->num_ch;
bl=q->bol;
while ((c!= 35 || gettop(&OPTR)!=35)){
// printf("while start!\n");
if (bl!=1) {
push(&OPND, c);
q=q->next;
c=q->num_ch;
bl=q->bol;
} // 不是運(yùn)算符則進(jìn)棧
else {
top=gettop(&OPTR);
// printf("top %c",top);
switch (precede(top, c)) {
case '<':
// 棧頂元素優(yōu)先權(quán)低
push(&OPTR, c);
q=q->next;
c=q->num_ch;
bl=q->bol;
break;
case '=': // 脫括號并接收下一字符
pop(&OPTR, &c);
q=q->next;
c=q->num_ch;
bl=q->bol;
break;
case '>': // 退棧并將運(yùn)算結(jié)果入棧
pop(&OPTR, &theta);
pop(&OPND, &b);
pop(&OPND, &a);
// printf("q->num_ch is %d\n",q->num_ch);
push(&OPND, Operate(a, theta, b));
break;
default :
printf("沒有這個(gè)運(yùn)算符!\n");
return 0;
} // switch
}//else
} // while
result=gettop(&OPND);
return result;
}
else {
printf("你的輸入有錯(cuò)誤!\n");
return 0;
}
} // EvaluateExpression
int randomm()//產(chǎn)生四個(gè)隨機(jī)數(shù)
{
int i=0;
srand((unsigned)time(NULL));
for (;i<4;i++){
number[0][i]=0;
number[0][i]=rand();
number[0][i]%=13;
number[0][i]++;
number[1][i]=0;
}
return number[2][4];
}
int CalcOneExpress(int expression[][2])
{
// 算術(shù)表達(dá)式求值的算符優(yōu)先算法。
// 設(shè)OPTR和&&OPND分別為運(yùn)算符棧和運(yùn)算數(shù)棧,OP為運(yùn)算符集合。
int index=0,result,c,theta,a,b;
sqstack OPTR; // 運(yùn)算符棧,字符元素
sqstack OPND; // 運(yùn)算數(shù)棧,實(shí)數(shù)元素
initstack(&OPTR);
push(&OPTR, 35);
initstack (&OPND);
c=expression[index][0];
while (c!= 35 || gettop(&OPTR)!=35){
if (expression[index][1]!=1) {
push(&OPND, c);
index++;
c=expression[index][0];
} // 不是運(yùn)算符則進(jìn)棧
else {
switch (precede(gettop(&OPTR), c)) {
case '<':
// 棧頂元素優(yōu)先權(quán)低
push(&OPTR, c);
index++;
c=expression[index][0];
break;
case '=': // 脫括號并接收下一字符
pop(&OPTR, &c);
index++;
c=expression[index][0];
break;
case '>': // 退棧并將運(yùn)算結(jié)果入棧
pop(&OPTR, &theta);
pop(&OPND, &b);
pop(&OPND, &a);
push(&OPND, Operate(a, theta, b));
break;
default :
printf("沒有這個(gè)運(yùn)算符\n");
return 0;
} // switch
}//else
} // while
result=gettop(&OPND);
// printf("the result is %d\n",result);
return result;
} // EvaluateExpression
int Equal24(int n)
{
if(n==24){
// printf("the result is %d\n",n);
return TRUE;
}
else return FALSE;
}
//括號的幾種情況
//1 無括號
//2 (a b) c d 同a b (c d), 下省略
//3 (a b c) d
//4 a (b c) d
//5 (a b) (c d)
//6 ((a b) c) d
//7 (a (b c)) d
int CalcArray1(int iNumInput[2][4])
{
// a * b * c * d //7 number
int expression[8][2],ii,jj,kk;
int i,j,k,l,dRes;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(j==i)
{
continue;
}
for(k=0;k<4;k++)
{
if(k==i||k==j)
{
continue;
}
for(l=0;l<4;l++)
{
if(l==i||l==j||l==k)
{
continue;
}
expression[0][0]=iNumInput[0][i];
expression[2][0]=iNumInput[0][j];
expression[4][0]=iNumInput[0][k];
expression[6][0]=iNumInput[0][l];
expression[0][1]=eNumber;
expression[2][1]=eNumber;
expression[4][1]=eNumber;
expression[6][1]=eNumber;
for (ii=0;ii<4;ii++)
{
for (jj=0;jj<4;jj++)
{
for (kk=0;kk<4;kk++)
{
expression[1][0] = oper[ii];
expression[1][1] = eOperator;
expression[3][0] = oper[jj];
expression[3][1] = eOperator;
expression[5][0] = oper[kk];
expression[5][1] = eOperator;
expression[7][0] = oper[6];
expression[7][1] = eOperator;
dRes = CalcOneExpress(expression);
if(Equal24(dRes))
{
printf("可以這樣運(yùn)算:%d%c%d%c%d%c%d\n",expression[0][0],oper[ii],expression[2][0],oper[jj],expression[4][0],oper[kk],expression[6][0]);
return TRUE;
}
}
}
}//end of for oper
}
}
}
}
return FALSE;
}
int CalcArray2(int iNumInput[2][4])
{
// (a * b) * c * d //9 number
int expression[10][2];
int ii,jj,i,j,k,l,kk;
int dRes;
// printf("CalcArray2\n");
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(j==i)
{
continue;
}
for(k=0;k<4;k++)
{
if(k==i||k==j)
{
continue;
}
for(l=0;l<4;l++)
{
if(l==i||l==j||l==k)
{
continue;
}
expression[1][0]=iNumInput[0][i];
expression[3][0]=iNumInput[0][j];
expression[6][0]=iNumInput[0][k];
expression[8][0]=iNumInput[0][l];
expression[1][1]=eNumber;
expression[3][1]=eNumber;
expression[6][1]=eNumber;
expression[8][1]=eNumber;
for (ii=0;ii<4;ii++)
{
for (jj=0;jj<4;jj++)
{
for (kk=0;kk<4;kk++)
{
expression[2][0] = oper[ii];
expression[2][1] = eOperator;
expression[5][0] = oper[jj];
expression[5][1] = eOperator;
expression[7][0] = oper[kk];
expression[7][1] = eOperator;
expression[9][0] = oper[6];
expression[9][1] = eOperator;
expression[0][0] = oper[4];
expression[0][1] = eOperator;
expression[4][0] = oper[5];
expression[4][1] = eOperator;
dRes = CalcOneExpress(expression);
if(Equal24(dRes))
{
printf("可以這樣運(yùn)算:%c%d%c%d%c%c%d%c%d\n",oper[4],expression[1][0],oper[ii],expression[3][0],oper[5],oper[jj],expression[6][0],oper[kk],expression[8][0]);
return TRUE;
}
}
}
}//end of for oper
}
}
}
}
return FALSE;
}
int CalcArray3(int iNumInput[2][4])
{
// (a * b * c) * d //9 number
int expression[10][2];
int ii,jj,i,j,k,l,kk;
int dRes;
// printf("CalcArray3\n");
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(j==i)
{
continue;
}
for(k=0;k<4;k++)
{
if(k==i||k==j)
{
continue;
}
for(l=0;l<4;l++)
{
if(l==i||l==j||l==k)
{
continue;
}
expression[1][0]=iNumInput[0][i];
expression[3][0]=iNumInput[0][j];
expression[5][0]=iNumInput[0][k];
expression[8][0]=iNumInput[0][l];
expression[1][1]=eNumber;
expression[3][1]=eNumber;
expression[5][1]=eNumber;
expression[8][1]=eNumber;
for (ii=0;ii<4;ii++)
{
for (jj=0;jj<4;jj++)
{
for (kk=0;kk<4;kk++)
{
expression[2][0] = oper[ii];
expression[2][1] = eOperator;
expression[4][0] = oper[jj];
expression[4][1] = eOperator;
expression[7][0] = oper[kk];
expression[7][1] = eOperator;
expression[9][0] = oper[6];
expression[9][1] = eOperator;
expression[0][0] = oper[4];
expression[0][1] = eOperator;
expression[6][0] = oper[5];
expression[6][1] = eOperator;
dRes = CalcOneExpress(expression);
if(Equal24(dRes))
{
printf("可以這樣運(yùn)算:%c%d%c%d%c%d%c%c%d\n",oper[4],expression[1][0],oper[ii],expression[3][0],oper[jj],expression[5][0],oper[5],oper[kk],expression[8][0]);
return TRUE;
}
}
}
}//end of for oper
}
}
}
}
return FALSE;
}
int CalcArray4(int iNumInput[2][4])
{
// (a * b * c) * d //9 number
int expression[10][2];
int ii,jj,i,j,k,l,kk;
int dRes;
// printf("CalcArray4\n");
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(j==i)
{
continue;
}
for(k=0;k<4;k++)
{
if(k==i||k==j)
{
continue;
}
for(l=0;l<4;l++)
{
if(l==i||l==j||l==k)
{
continue;
}
expression[0][0]=iNumInput[0][i];
expression[3][0]=iNumInput[0][j];
expression[5][0]=iNumInput[0][k];
expression[8][0]=iNumInput[0][l];
expression[0][1]=eNumber;
expression[3][1]=eNumber;
expression[5][1]=eNumber;
expression[8][1]=eNumber;
for (ii=0;ii<4;ii++)
{
for (jj=0;jj<4;jj++)
{
for (kk=0;kk<4;kk++)
{
expression[1][0] = oper[ii];
expression[1][1] = eOperator;
expression[4][0] = oper[jj];
expression[4][1] = eOperator;
expression[7][0] = oper[kk];
expression[7][1] = eOperator;
expression[9][0] = oper[6];
expression[9][1] = eOperator;
expression[2][0] = oper[4];
expression[2][1] = eOperator;
expression[6][0] = oper[5];
expression[6][1] = eOperator;
dRes = CalcOneExpress(expression);
if(Equal24(dRes))
{
printf("可以這樣運(yùn)算:%d%c%c%d%c%d%c%c%d\n",expression[0][0],oper[ii],oper[4],expression[3][0],oper[jj],expression[5][0],oper[5],oper[kk],expression[8][0]);
return TRUE;
}
}
}
}//end of for oper
}
}
}
}
return FALSE;
}
int CalcArray5(int iNumInput[2][4])
{
// (a * b) * (c * d) //11 number
int expression[12][2];
int ii,jj,i,j,k,l,kk;
int dRes;
// printf("CalcArray5\n");
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(j==i)
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -