??
字號:
#include<stdio.h>
#include<string.h>
typedef struct{
char data[100];
int top;
}Stack;
typedef struct{
float data[100];
int top;
}NumStack;
void Init(Stack &s){
s.top=-1;
}
void NumInit(NumStack &s){
s.top=-1;
}
int StackEmpty(Stack s){
return s.top==-1;
}
int NumStackEmpty(NumStack s){
return s.top==-1;
}
int StackFull(Stack s){
return s.top==99;
}
int NumStackFull(NumStack s){
return s.top==99;
}
void Push(Stack &s,char x){
if(StackFull(s))
printf("stack overflow");
else s.data[++s.top]=x;
}
void NumPush(NumStack &s,float x){
if(NumStackFull(s))
printf("stack overflow");
else s.data[++s.top]=x;
}
char Pop(Stack &s){
if(StackEmpty(s)){
printf("stack underflow");
return 0;
}
else return s.data[s.top--];
}
float NumPop(NumStack &s){
if(NumStackEmpty(s)){
printf("stack underflow");
return 0;
}
else return s.data[s.top--];
}
char GetTop(Stack s){
if(StackEmpty(s)){
printf("stack is empty");
return 0;
}
else return s.data[s.top];
}
float NumGetTop(NumStack s){
if(NumStackEmpty(s)){
printf("stack is empty");
return 0;
}
else return s.data[s.top];
}
Stack Change(char e[]){
Stack a,s2;
int i=0;
char w;
Init(a);
Init(s2);
while(e[i]){
if('0'<=e[i]&&e[i]<='9'){
while(('0'<=e[i]&&e[i]<='9')||(e[i]=='.')){
Push(a,e[i]);
i++;
}
Push(a,' ');
}
if(!e[i]) break;
if(e[i]=='(') Push(s2,e[i]);
if(e[i]==')'){
w=Pop(s2);
while(w!='('){
Push(a,w);
w=Pop(s2);
}
}
if((e[i]=='+')||(e[i]=='-')){
if(!StackEmpty(s2)){
w=GetTop(s2);
while(w!='('){
Push(a,w);
w=Pop(s2);
if(StackEmpty(s2)) break;
else w=GetTop(s2);
}
}
Push(s2,e[i]);
}
if((e[i]=='*')||(e[i]=='/')){
if(!StackEmpty(s2)){
w=GetTop(s2);
while((w=='*')||(w=='/')){
Push(a,w);
w=Pop(s2);
if(StackEmpty(s2)) break;
else w=GetTop(s2);
}
}
Push(s2,e[i]);
}
i++;
}
while(!StackEmpty(s2)) Push(a,Pop(s2));
Push(a,'\0');
return a;
}
float Exchange(char *m){
float k=0;
while(*m&&*m!='.')
k=k*10+(float)(*(m++)-'0');
if(*m=='.'){
m++;
float x=1;
while(*m){
x=x/10;
k=k+x*(float)(*(m++)-'0');
}
}
return k;
}
float Calculate(char *A){
NumStack s;
float j;
int i=0;
NumInit(s);
while(A[i]){
if('0'<=A[i]&&A[i]<='9'){
char m[20];
int n=0;
while(('0'<=A[i]&&A[i]<='9')||(A[i]=='.'))
m[n++]=A[i++];
m[n]='\0';
NumPush(s,Exchange(m));
}
else{
switch(A[i]){
case '+':NumPush(s,NumPop(s)+NumPop(s));break;
case '-':NumPush(s,-(NumPop(s)-NumPop(s)));break;
case '*':NumPush(s,NumPop(s)*NumPop(s));break;
case '/':j=NumPop(s);NumPush(s,NumPop(s)/j);break;
}
}
i++;
}
return NumPop(s);
}
void main(){
char e[100];
Stack a;
printf("請輸入中綴表達式:\n");
scanf("%s",e);
a=Change(e);
printf("對應的后綴表達式為\n");
printf("%s\n",a.data);
printf("表達式的值為\n%.2f\n",Calculate(a.data));
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -