栈的计算#include<stdio.h>
#include<malloc.h>
#include<string.h>
typedef struct{
char *base;
char *top;
int stacksize;
}SqStack;
int InitStack(SqStack &S){
S.base=(char *)malloc(10*sizeof(char));
S.top=S.base;
S.stacksize=10;
return 1;
}
int Push(SqStack &S,char e){
if(S.top-S.base-1>=S.stacksize){
S.base=(char*)realloc(S.base,(S.stacksize+2)*sizeof(char));
}
*S.top=e;
S.top=S.top+1;
return 1;
}
int GetTop(SqStack S,char &e){
if(S.top==S.base)return 0;
e=*(S.top-1);
return 1;
}
int Pop(SqStack &S,char&e){
if(S.top==S.base)return 0;
e=*--S.top;
return 1;
}
int Priority(char a,char b,int n){
if(a=='#'){
a='0';
}
else if(a==')'){
a='1';
}
else if(a=='+'||a=='-'){
a='2';
}else if(a=='*'||a=='/'){
a='3';
}
else if(a=='('){
a='4';
}
else
return 0;
if(b=='#'){
b='0';
}
else if(b==')'){
b='1';
}
else if(b=='+'||b=='-'){
b='2';
}
else if(b=='*'||b=='/'){
b='3';
}
else if(b=='('){
b='4';
}
else
return 0;
if(n==0){
if(b-a>0||a=='4')
return 1;
else
return 0;}
else{
if(b-a>=0||a=='4')
return 1;
else
return 0;
}
}
int Transform_2_suffix(char in[40],char *suf){
SqStack S;
static int n=0;
int i=0,j=0,k;
char e,a,b;
InitStack(S);
Push(S,'#');
while(in[i]!='#'){
GetTop(S,e);
a=e;
b=in[i];
k=Priority(a,b,n);
if(in[i]>='0'&&in[i]<='9'){
suf[j]=in[i];
i++;
j++;
}
else if(k==1){
Push(S,in[i]);
i++;
}
else{
while(*(S.top-1)!='#'){
Pop(S,e);
if(e=='(')break;
suf[j]=e;
j++;
suf[j]=' ';
j++;
}
if(in[i]!=')')
Push(S,in[i]);
i++;
}
if(j!=0&&!(j!=0&&in[i-1]>='0'&&in[i-1]<='9'&&in[i]>='0'&&in[i]<='9')&&!(suf[j-1]==' ')){
suf[j]=' ';
j++;
}
}
while(S.top!=S.base){
Pop(S,e);
suf[j]=e;
j++;
suf[j]=' ';
j++;
}
suf[j]=0;
n++;
return 1;
}
int Transform_2_prefix(char in[],char *pre){
char a[40];
int i=1,j=0,k;
strcpy(a,in);
while(a[i]!='#'){
i++;}
i--;
while(j<i/2){
k=a[i-j];
a[i-j]=a[0+j];
a[0+j]=k;
j++;
}
i=0;
while(a[i]!=' '){
if(a[i]=='(')a[i]=')';
else if(a[i]==')')a[i]='(';
else;
i++;
}
Transform_2_suffix(a,pre);
i=j=0;
while(pre[i]!='#'){
i++;}
i-=2;
while(j<i/2){
k=pre[i-j];
pre[i-j]=pre[0+j];
pre[0+j]=k;
j++;
}
return 1;
}
//以上为表达式的转换//
//以下为表达式的求值//
typedef struct{
float *base;
float *top;
int stacksize;
}num_SqStack;
int num_InitStack(num_SqStack &S){
S.base=(float *)malloc(10*sizeof(float));
S.top=S.base;
S.stacksize=10;
return 1;
}
int num_Push(num_SqStack &S,float e){
if(S.top-S.base-1>=S.stacksize){
S.base=(float*)realloc(S.base,(S.stacksize+2)*sizeof(float));
}
*S.top=e;
S.top=S.top+1;
return 1;
}
int num_GetTop(num_SqStack S,float &e){
if(S.top==S.base)return 0;
e=*(S.top-1);
return 1;
}
int num_Pop(num_SqStack &S,float&e){
if(S.top==S.base)return 0;
e=*--S.top;
return 1;
}
int Transform_2_int(char k,float&e){
e=k-'0';
return 1;
}
int suffix_operation(char suffix[],float &result){
num_SqStack S;
int i=0;
float e,a,b,z;
char k;
num_InitStack(S);
static int c=0;
while(suffix[i]!='#'){
k=suffix[i];
if(k>='0'&&k<='9'){
Transform_2_int(k,e);
num_Push(S,e);
i++;
}
else if(k=='+'||k=='-'||k=='*'||k=='/'){
num_Pop(S,b);
num_Pop(S,a);
if(c==1){
z=b;
b=a;
a=z;
}
switch(k){
case '+' :e=a+b;break;
case '-' :e=a-b;break;
case '*' :e=a*b;break;
case '/' :e=a/b;break;
default :return 0;
}
num_Push(S,e);
i++;
}
else i++;
}
num_Pop(S,result);
c++;
return 1;
}
int prefix_operation(char prefix[],float &result){
int i=0,j=0;
char a[40],k;
strcpy(a,prefix);
while(a[i]!='#'){
i++;}
i--;
while(j<i/2){
k=a[i-j];
a[i-j]=a[0+j];
a[0+j]=k;
j++;
}
suffix_operation(a,result);
return 1;
}
void main(){
char infix[40],prefix[40]={0},suffix[40]={0};
float pre_result,suf_result;
printf("input:\n");
gets(infix);
printf("中缀表达式为:\n");
printf("%s\n",infix);
Transform_2_suffix(infix,suffix);
printf("\n");
Transform_2_prefix(infix,prefix);
printf("\n");
suffix_operation(suffix,suf_result);
prefix_operation(prefix,pre_result);
printf("前缀表达式为:\n");
printf("%s\n",prefix);
printf("后缀表达式为:\n");
printf("%s\n",suffix);
printf("后缀求值为:\n");
printf("%g\n",suf_result);
printf("前缀求值为:\n");
printf("%g\n",pre_result);
}
#include<malloc.h>
#include<string.h>
typedef struct{
char *base;
char *top;
int stacksize;
}SqStack;
int InitStack(SqStack &S){
S.base=(char *)malloc(10*sizeof(char));
S.top=S.base;
S.stacksize=10;
return 1;
}
int Push(SqStack &S,char e){
if(S.top-S.base-1>=S.stacksize){
S.base=(char*)realloc(S.base,(S.stacksize+2)*sizeof(char));
}
*S.top=e;
S.top=S.top+1;
return 1;
}
int GetTop(SqStack S,char &e){
if(S.top==S.base)return 0;
e=*(S.top-1);
return 1;
}
int Pop(SqStack &S,char&e){
if(S.top==S.base)return 0;
e=*--S.top;
return 1;
}
int Priority(char a,char b,int n){
if(a=='#'){
a='0';
}
else if(a==')'){
a='1';
}
else if(a=='+'||a=='-'){
a='2';
}else if(a=='*'||a=='/'){
a='3';
}
else if(a=='('){
a='4';
}
else
return 0;
if(b=='#'){
b='0';
}
else if(b==')'){
b='1';
}
else if(b=='+'||b=='-'){
b='2';
}
else if(b=='*'||b=='/'){
b='3';
}
else if(b=='('){
b='4';
}
else
return 0;
if(n==0){
if(b-a>0||a=='4')
return 1;
else
return 0;}
else{
if(b-a>=0||a=='4')
return 1;
else
return 0;
}
}
int Transform_2_suffix(char in[40],char *suf){
SqStack S;
static int n=0;
int i=0,j=0,k;
char e,a,b;
InitStack(S);
Push(S,'#');
while(in[i]!='#'){
GetTop(S,e);
a=e;
b=in[i];
k=Priority(a,b,n);
if(in[i]>='0'&&in[i]<='9'){
suf[j]=in[i];
i++;
j++;
}
else if(k==1){
Push(S,in[i]);
i++;
}
else{
while(*(S.top-1)!='#'){
Pop(S,e);
if(e=='(')break;
suf[j]=e;
j++;
suf[j]=' ';
j++;
}
if(in[i]!=')')
Push(S,in[i]);
i++;
}
if(j!=0&&!(j!=0&&in[i-1]>='0'&&in[i-1]<='9'&&in[i]>='0'&&in[i]<='9')&&!(suf[j-1]==' ')){
suf[j]=' ';
j++;
}
}
while(S.top!=S.base){
Pop(S,e);
suf[j]=e;
j++;
suf[j]=' ';
j++;
}
suf[j]=0;
n++;
return 1;
}
int Transform_2_prefix(char in[],char *pre){
char a[40];
int i=1,j=0,k;
strcpy(a,in);
while(a[i]!='#'){
i++;}
i--;
while(j<i/2){
k=a[i-j];
a[i-j]=a[0+j];
a[0+j]=k;
j++;
}
i=0;
while(a[i]!=' '){
if(a[i]=='(')a[i]=')';
else if(a[i]==')')a[i]='(';
else;
i++;
}
Transform_2_suffix(a,pre);
i=j=0;
while(pre[i]!='#'){
i++;}
i-=2;
while(j<i/2){
k=pre[i-j];
pre[i-j]=pre[0+j];
pre[0+j]=k;
j++;
}
return 1;
}
//以上为表达式的转换//
//以下为表达式的求值//
typedef struct{
float *base;
float *top;
int stacksize;
}num_SqStack;
int num_InitStack(num_SqStack &S){
S.base=(float *)malloc(10*sizeof(float));
S.top=S.base;
S.stacksize=10;
return 1;
}
int num_Push(num_SqStack &S,float e){
if(S.top-S.base-1>=S.stacksize){
S.base=(float*)realloc(S.base,(S.stacksize+2)*sizeof(float));
}
*S.top=e;
S.top=S.top+1;
return 1;
}
int num_GetTop(num_SqStack S,float &e){
if(S.top==S.base)return 0;
e=*(S.top-1);
return 1;
}
int num_Pop(num_SqStack &S,float&e){
if(S.top==S.base)return 0;
e=*--S.top;
return 1;
}
int Transform_2_int(char k,float&e){
e=k-'0';
return 1;
}
int suffix_operation(char suffix[],float &result){
num_SqStack S;
int i=0;
float e,a,b,z;
char k;
num_InitStack(S);
static int c=0;
while(suffix[i]!='#'){
k=suffix[i];
if(k>='0'&&k<='9'){
Transform_2_int(k,e);
num_Push(S,e);
i++;
}
else if(k=='+'||k=='-'||k=='*'||k=='/'){
num_Pop(S,b);
num_Pop(S,a);
if(c==1){
z=b;
b=a;
a=z;
}
switch(k){
case '+' :e=a+b;break;
case '-' :e=a-b;break;
case '*' :e=a*b;break;
case '/' :e=a/b;break;
default :return 0;
}
num_Push(S,e);
i++;
}
else i++;
}
num_Pop(S,result);
c++;
return 1;
}
int prefix_operation(char prefix[],float &result){
int i=0,j=0;
char a[40],k;
strcpy(a,prefix);
while(a[i]!='#'){
i++;}
i--;
while(j<i/2){
k=a[i-j];
a[i-j]=a[0+j];
a[0+j]=k;
j++;
}
suffix_operation(a,result);
return 1;
}
void main(){
char infix[40],prefix[40]={0},suffix[40]={0};
float pre_result,suf_result;
printf("input:\n");
gets(infix);
printf("中缀表达式为:\n");
printf("%s\n",infix);
Transform_2_suffix(infix,suffix);
printf("\n");
Transform_2_prefix(infix,prefix);
printf("\n");
suffix_operation(suffix,suf_result);
prefix_operation(prefix,pre_result);
printf("前缀表达式为:\n");
printf("%s\n",prefix);
printf("后缀表达式为:\n");
printf("%s\n",suffix);
printf("后缀求值为:\n");
printf("%g\n",suf_result);
printf("前缀求值为:\n");
printf("%g\n",pre_result);
}