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

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

算法思想

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

需要注意的知识点

字符串的初始化方法
  • 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栈和队列的应用

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值