利用栈将中缀表达式转为后缀表达式

2019-03-21  本文已影响0人  Aurochsy

利用栈将中缀表达式转为后缀表达式

算法思想

需要注意的知识点

字符串的初始化方法

STL中栈stack的使用

代码

#include<stdio.h>
#include<iostream>
#include<stack>

using namespace std;

bool mitToPost(char *exp,char *posExp,int len);

int main(){ 
    char exp[16]="a/b+(c*d-e*f)/g"; 
    //char exp[15] = {'a','/','b','+','(','c','*','d','-','e','*','f',')','/','g'};
    int len = sizeof(exp)/sizeof(exp[0]);
//  printf("%d",len);//按第一种初始化方法,结果是16 
//  if(exp[15]==NULL) //会返回true 
//      printf("hei");
//  if(exp[15]=='\0') //会返回true 
//      printf("hoo");
    
    char posExp[16];
    //int posLen=sizeof(posExp)/sizeof(posExp[0]);//得到的是16,即分配的长度 
    bool res = mitToPost(exp,posExp,len);
    
    int i=0;
    while(posExp[i]!='\0'){
        printf("%c",posExp[i]);
        i++;
    }
    return 0;
} 
bool mitToPost(char *exp,char *posExp,int len){
    
    stack <char> S;
    int i=0,j=0;
    
    if(len==0) return false;
    
    while(exp[i]!='\0'){//扫描前缀表达式
    //for(i=0;i<len;){ //这样写也可以 
        switch(exp[i]){
            case '(':
                S.push(exp[i]);
                break;
                
            case ')':
                while(!S.empty()&&S.top()!='('){
                    posExp[j++]=S.top();
                    S.pop();
                }
                //posExp[j++]=S.top(); 
                S.pop();//把'('也弹出来,但是不用存到后缀表达式中
                break;
                
            case '*':
            case '/':
                while(!S.empty() && S.top()!='-'&&S.top()!='+'&&S.top()!='('){
                    posExp[j++]=S.top();
                    S.pop();
                }
                S.push(exp[i]);
                break;
                
            case '+':
            case '-':
                while(!S.empty()&&S.top()!='('){
                    posExp[j++]=S.top();
                    S.pop();
                }
                S.push(exp[i]);
                break;
            
            default:
                posExp[j++]=exp[i];
                break;                              
            
        }
        i++;    
    }
    while(!S.empty()){
            posExp[j++]=S.top();
            S.pop();
    }
    return true;
}

参考资料

[1] C语言给字符数组赋值的方法

[2] STL栈stack的使用

[3] 《王道-数据结构》-3.3栈和队列的应用

上一篇 下一篇

猜你喜欢

热点阅读