码迷,mamicode.com
首页 > 其他好文 > 详细

中缀表达式转换成为后缀表达式

时间:2018-06-13 11:32:01      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:标准   判断   priority   creat   元素   else   span   handle   c++   

算法的基本流程

遍历中缀表达式中的数字和符号

对于数字:直接输出

对于符号:

左括号:进栈 

运算符号:与栈顶符号进行优先级比较

    若栈顶符号优先级低:此符合进栈  (默认栈顶若是左括号,左括号优先级最低) 

    若栈顶符号优先级不低:将栈顶符号弹出并输出,之后进栈

右括号:将栈顶符号弹出并输出,直到匹配左括号

遍历结束:将栈中的所有符号弹出并输出。

下面的代码是用之前的linkStack来实现的,没有借助于C++标准库,当然用C++标准库实现起来hi更优雅一点,笔记自己用C写的代码,还是有点难看的。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include "linkStack.h"

bool isoperator(char op)
{
    switch (op)
    {
    case +:
    case -:
    case *:
    case /:
    case (:
        return 1;
    default:
        return 0;
    }
}

int priority(char op)
{
    switch (op)
    {
    case (:
        return 0;
    case +:
    case -:
        return 1;
    case *:
    case /:
        return 2;
    default:
        return -1;
    }
}

void handle(char *s)
{
    linkStack* stack = linkStack_Create();

    int len = strlen(s);

    for(int i=0; i<len; ++i)
    {
        if(isoperator(s[i]))
        {
//如果栈为空或者是操作符为‘(‘就直接进栈了
if(linkStack_Size(stack)==0 || s[i] == () { linkStack_Push(stack,&s[i]); continue; }
//优先级的判断
if(priority(s[i]) >= priority(*((char*)linkStack_Top(stack)))) { linkStack_Push(stack,&s[i]); }else { printf("%c", *((char*)linkStack_Pop(stack))); linkStack_Push(stack,&s[i]); } }//准备出栈了 else if(s[i] == )) { while(true) { char tmp = *((char*)linkStack_Pop(stack)); if(tmp == () break; printf("%c", tmp); } } else { printf("%c",s[i]); } }//将栈中的所有元素全部投弹出去 while(linkStack_Size(stack) > 0) { printf("%c", *((char*)linkStack_Pop(stack))); } } int main() { char mid_expre[] = "8+(3-1)*5"; handle(mid_expre); return 0; }
//后续操作,将后缀表达式进行计算也是借助于栈的利用,不过就比较简单了相对来讲。

中缀表达式转换成为后缀表达式

标签:标准   判断   priority   creat   元素   else   span   handle   c++   

原文地址:https://www.cnblogs.com/randyniu/p/9176012.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!