数组如 a[] 可以直接用a在函数中传递并操作,不用考虑二级指针。
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
typedef struct Stack{
int a[100];
int top;
}Stack;
void setEquation(int str[]){
int i=0,j=0,num=0,flag=0;
char s[100];
scanf("%s",s);
//printf("%s\n",s);
/* while(s[i]!='#'){
printf("%c ",s[i]);
i++;
}*/
while(s[i]!='\0'){
if(s[i]>='0' && s[i]<='9'){
num=num*10 + s[i]-48;
flag=0;
}else{
if(s[i]=='('){
str[j++]='('-50;
i++;
continue;
}
if(flag==0){
str[j++]=num;
num=0;
str[j++]=s[i]-50;
flag=1;
}else{
str[j++]=s[i]-50;
}
}
i++;
}
/* while(str[i]!='#'){
if(str[i]=='+' || str[i]=='-' || str[i]=='*' || str[i]=='/' || str[i]=='#' || str[i]=='(' || str[i]==')')
printf("%c ",str[i]);
else
printf("%d ",str[i]);
i++;
}*/
}
int initStack(Stack **p){
*p=(Stack*)malloc(sizeof(Stack));
if(!*p)
return 0;
(**p).top=0;
return 1;
}
int push(Stack *stk,int c){
if(stk->top<100){
stk->a[stk->top++]=c;
return 1;
}
return 0;
}
int pop(Stack *stk,int *e){
if(stk->top>0){
*e=stk->a[--stk->top];
}
return 0;
}
int choose(int c){
int ch=c+50;
if(ch=='+' || ch=='-'){
return 1;
}else if(ch=='*' || ch=='/'){
return 2;
}else if(ch==')'){
return 3;
}else if(ch=='('){
return 0;
}else{
return 0;
}
}
void showstr(int *str){
int i=0;
while(str[i]+50!='#'){
if(str[i]>=0)
printf("%d ",str[i]);
else
printf("%c ",str[i]+50);
i++;
}
printf("\n");
}
int operation(int num1,int num2,int op){
switch(op+50){
case '+': return num1+num2;
break;
case '-': return num1-num2;
break;
case '*': return num1*num2;
break;
case '/': return num1/num2;
break;
}
return 0;
}
int computePostEp(int postExpression[]){
Stack *stkComppute;
initStack(&stkComppute);
int i=0,num1,num2,op,j,e=0;
while(postExpression[i]!='#'-50){
if(postExpression[i]>=0){
push(stkComppute,postExpression[i]);
}else{
pop(stkComppute,&e);
num2=e;
pop(stkComppute,&e);
num1=e;
op=postExpression[i];
j = operation(num1,num2,op);
push(stkComppute,j);
}
i++;
}
pop(stkComppute,&e);
return e;
}
int *change(int str[],int postExpression[]){
int i=0,e;
int k=0;
Stack *stk;
initStack(&stk);
while(str[i]!=-15){
if(str[i]>0){
//printf("%d ",str[i]);
postExpression[k++]=str[i];
}else if(str[i]+50=='('){
push(stk,str[i]);
}else if(str[i]+50==')'){
while(stk->top>0){
pop(stk,&e);
if(e!='('-50 && e!=')'-50){
//printf("%c ",e+50);
postExpression[k++]=e;
}
if(e=='('-50){
break;
}
}
}else{
if(choose(str[i])<=choose(stk->a[stk->top-1])){
while(stk->top>0){
pop(stk,&e);
if(e!='('-50 && e!=')'-50){
//printf("%c ",e+50);
postExpression[k++]=e;
}
if(e=='('-50){
break;
}
}
push(stk,str[i]);
// printf("%c:ok ",stk->a[stk->top-1]+50);
}else{
push(stk,str[i]);
//printf("%c:ok ",stk->a[stk->top-1]+50);
}
}
i++;
}
while(stk->top>0){
//printf("%c",stk->a[--stk->top]+50);
postExpression[k++]=stk->a[--stk->top];
}
postExpression[k++]='#'-50;
//*p=postExpression;
//showstr(*p);
//printf("\n");
return postExpression;
}
int main(){
//rank表示等级,()最高级:3,*/ 中级:2,+-最低级:1,rank:0 表示数字
//={187,'+'-50,12,'*'-50,'('-50,'('-50,3,'-'-50,14,')'-50,'*'-50,'('-50,222,'+'-50,33,')'-50,')'-50,'-'-50,12,'#'-50}
//={'('-50,100,'-'-50,23,')'-50,'/'-50,6,'+'-50,2,'*'-50,'('-50,13,'-'-50,9,')'-50,'-'-50,40,'#'-50}
int str01[100];
int str02[100];
int str03[100];
int str04[100];
int str05[100];
setEquation(str01);
setEquation(str02);
setEquation(str03);
setEquation(str04);
setEquation(str05);
int postExpression01[100]={0};
int postExpression02[100]={0};
int postExpression03[100]={0};
int postExpression04[100]={0};
int postExpression05[100]={0};
change(str01,postExpression01);
change(str02,postExpression02);
change(str03,postExpression03);
change(str04,postExpression04);
change(str05,postExpression05);
showstr(postExpression01);
printf("%d\n",computePostEp(postExpression01));
showstr(postExpression02);
printf("%d\n",computePostEp(postExpression02));
showstr(postExpression03);
printf("%d\n",computePostEp(postExpression03));
showstr(postExpression04);
printf("%d\n",computePostEp(postExpression04));
showstr(postExpression05);
printf("%d\n",computePostEp(postExpression05));
return 0;
}