美文网首页
利用栈将中缀表达式转为后缀表达式

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

作者: Aurochsy | 来源:发表于2019-03-21 15:49 被阅读0次

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

算法思想

  • 顺序扫描中缀表达式(可以存储在字符数组中)
  • 判断当前元素类型:
    • 如果是数字,直接加入后缀表达式序列中(可以用数组或队列存储)
    • 如果是" ( ",将其存入字符栈中
    • 如果是" ) ", 字符栈出栈,直到遇到 " ( " 为止, "(" 也出栈,注意"("不需要存入后缀表达式数组中
    • 如果是其它符号
      • 如果该符号比当前栈顶的符号的优先级高,则直接入栈
      • 否则字符栈出栈,直到栈顶符号的优先级比该元素低(优先级相同的也得出栈)

需要注意的知识点

字符串的初始化方法

  • 1.定义的时候直接用字符串赋值
    • char a[10]="hello";
    • 注意:不能先定义再给它赋值,如 char a[10]; a[10]="hello"; 这样是错误的!
    • 另外 字符数组最后一个元素为'\0',所以字符数组的长度要比输入的字符串长度至少大1!比如 char[6]="hello"; 但是如果是挨个赋值的话则不用 比如char[2]={'a','b'};遍历数组最好要 while(char[i]!='\0') 的方法,因为求数组长度 sizeof(arr)/sizeof(arr[0]) 得到的是初始化分配的长度,而不是后来往里面填充的元素个数
  • 2.对数组中字符逐个赋值
    • char a[10]={'h','e','l','l','o'};
    • 注意:大括号里的元素不能用""括起来,只能用''
  • 3、利用 strcpy
    • char a[10]; strcpy(a, "hello");

STL中栈stack的使用

  • 注意STL中,S.pop() 不会返回弹出的栈顶值,需要用 S.top()
  • 出栈和取栈顶前先判断栈是否为空

代码

#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栈和队列的应用

相关文章

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

    利用栈将中缀表达式转为后缀表达式 算法思想 顺序扫描中缀表达式(可以存储在字符数组中) 判断当前元素类型:如果是数...

  • 四则运算表达式求值

    利用栈求解四则运算:求解思路为先将中缀表达式转换为后缀表达式,再利用后缀表达式求解中缀表达式:运算符出现在两个数字...

  • 中缀转后缀字符串表达式求值

    概念 前缀表达式(波兰表达式)运算符位于操作数前,右到左依次入栈 中缀表达式从左到右依次入栈,一般转为后缀表达式 ...

  • 计算器

    使用Java写的一个可以计算+,-,*,/ 的计算器。首先用栈把中缀表达式转化成后缀表达式,再利用栈对后缀表达式求...

  • 一些算法题

    1.四则运算表达式求值: 两个栈存储,中缀表达式转为后缀表达式 okcalculate1 & calculate2...

  • Python 简单计算器-逆波兰后缀表达式实现

    中缀表达式 后缀表达式 简易计算器,可以通过栈来实现。然而如果直接使用中缀表达式,需要处理括号,而使用后缀表达式则...

  • 数据结构与算法--后缀表达式

    中缀表达式转后缀表达式 中缀表达式转后缀表达式的思路步骤分析。 初始化一个栈和一个队列,运算符栈 S1 和存储中间...

  • 中缀表达式转后缀表达式

    将中缀表达式转为后缀表达式,输入 a+bc/d-a+f/b 输出 abcd/+a-fb/+要求:语言不限;输入输出...

  • 栈的应用——后缀表达式

    1.计算机处理标准表达式的能力,最重要的有两步:将中缀表达式转化为后缀表达式(栈用来进出运算的符号)将后缀表达式进...

  • 利用栈将中缀转为后缀

    大概算法思路如下: 1)如果遇到操作数,我们就直接将其输出。2)如果遇到操作符,则我们将其放入到栈中,遇到左括号时...

网友评论

      本文标题:利用栈将中缀表达式转为后缀表达式

      本文链接:https://www.haomeiwen.com/subject/dwfcvqtx.html