⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 新建 文本文档.cpp

📁 cong bie ren na zuanzaide
💻 CPP
字号:
#include <stdio.h> 

#include<stdlib.h> 

#include<string.h>   

#define MAX 30 

  

int GetStr(char str[]);/*输入算术表达式*/ 

void  Print(char exp[], int len);/*输出表达式*/ 

int Change(char str[], char exp[]);/*将一般表达式转化为逆波兰表达式*/ 

float JiSuan(char exp[]); /*求逆波兰表达式的值*/ 


int main(void) 

{ 

    char str[MAX], *pstr=str;/*存储原算术表达式*/  

   char exp[MAX], *pexp=exp;/*存储转化成的逆波兰表达式*/  

   float result;   /*存储逆波兰表达式的值*/ 

   int len1, len2;/*len1存储原算术表达式的长度,len2存储转化成的逆波兰表达式的长度*/  

   len1=GetStr(pstr); 

   printf("原算术表达式: "); 

   Print(pstr, len1);   

   len2=Change(pstr, pexp); 

   printf("逆波兰表达式: "); 

   Print(pexp,len2); 

   

   result=JiSuan(pexp); 

   printf("The result is: %f", result); 


   system("pause"); 

   return 0; 

}   

int GetStr(char str[]) 

{ 

    int i=0; 

    printf("请输入算术表达式:  "); 

    do{ 

      scanf("%c", &str[i++]);/*设字符‘#’为表达式的终止符*/ 

   }while(str[i-1] != '#' && i < MAX); 

   return i; 

}  


void  Print(char exp[], int len) 

{ 

   int i; 

   for(i=0; i<len; i++) 

       printf("%c", exp[i]); 

   printf("\n"); 

}  


int Change(char str[], char exp[]) 

{ 

    int i, t, top;/*t作为exp的下标,top作为stack的下标,i作为str的下标*/ 

    char stack[MAX], ch;/*作为栈使用*/    

    t=0; 

   i=0; 

   top=0; 

   stack[0]='#'; 

   ch=str[i++]; 

   while(ch != '#') 

   { 

      if(ch >= '0' && ch <= '9')  //如果是数字,直接存入数组 

          exp[t++]=ch; 

        else if(ch == '(')  //如果是左括号,入栈 

            stack[++top]=ch; 

        else if(ch == ')')//如果是右括号,出栈 

        { 

           while(stack[top] != '(') 

               exp[t++]=stack[top--]; 

          top--; 

        } 

      else if(ch == '+' || ch == '-') //如果是操作数,根据优先级出,入栈 

      { 

         while(top != 0 && stack[top] != '(') 

             exp[t++]=stack[top--]; 

            stack[++top]=ch; 

      }   

      else if(ch == '*' || ch == '/') 

      { 

         while(stack[top] == '*' || stack[top] == '/') 

           exp[t++]=stack[top--]; 

            stack[++top]=ch; 

      }   

      else    //不理会错误字符 

          printf("\n%c ia a wrong letter\n", ch); 

      ch=str[i++];     

   }  


   while(top != 0) 

       exp[t++]=stack[top--]; 

   exp[t]='#'; 

   return t+1; 

}   

float JiSuan(char exp[]) 

{ 

   float stack[MAX], d;/*作为栈使用*/ 

   char c; 

   int i=0, t=0, top=0; 

  

   c=exp[t++]; 

   while(c != '#') 

   { 

      d=c-'0'; 

      if(c >= '0' && c <= '9') 

          stack[top++]=d; 

        else 

        { 

           switch(c) 

           { 

              case '+': stack[top-2]=stack[top-2]+stack[top-1]; 

                           break; 

               case '-': stack[top-2]=stack[top-2]-stack[top-1]; 

                           break; 

              case '*': stack[top-2]=stack[top-2]*stack[top-1]; 

                           break; 

            case '/': if(stack[top] != 0) 

                                 stack[top-2]=stack[top-2]/stack[top-1]; 

                         else 

                                  printf("It's error!\n"); 

                           break;                

           }  

         top--; 

        }  

      c=exp[t++]; 

   } 

   return stack[top-1]; 

}   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -