首页 > 其他分享 >栈4-后缀表达式

栈4-后缀表达式

时间:2024-04-18 20:33:59浏览次数:22  
标签:LinkStack 符号 后缀 栈顶 MyChar mychar stack 表达式

栈4-后缀表达式


中缀转后缀

数字: 直接输出

左括号:  进栈

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

栈顶若是左括号, 优先级最低

栈顶符号优先级低:  此符号进栈

栈顶符号优先级不低, 弹出栈顶符号后进栈

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

遍历结束: 弹出并输出所有符号


自定义栈结构

typedef struct MYCHAR{
    LinkNode node;
    char *p;
} MyChar;

创建栈结点

//创建MyChar
MyChar* CreateMyChar(char *p){
    MyChar *mychar = (MyChar*)malloc(sizeof(MyChar));
    mychar->p = p;
    return mychar;
}

判断

//判断数字
int isNumber(char c){
    return c>='0' && c<='9';
}
//左括号
int isLeft(char c){
    return c=='(';
}
//右括号
int isRight(char c){
    return c==')';
}
//判断是不是运算符号
int isOperator(char c){
    return c=='+' || c=='-' || c=='*' || c=='/';
}

操作

//数字操作
void numberOperate(char *c){
    cout << *c << " ";
}
//左括号操作
void leftOperate(LinkStack *stack, char *p){
    Push_LinkStack(stack, (LinkNode*)CreateMyChar(p));
}
//右括号操作
void rightOperate(LinkStack *stack, char *p){
    while(Size_LinkStack(stack) >0){
        MyChar *mychar = (MyChar*)Top_LinkStack(stack);
        //如果匹配到左括号, 弹出
        if(isLeft(*(mychar->p))){
            Pop_LinkStack(stack);
            break;
        }
        cout << *(mychar->p) << " ";
        Pop_LinkStack(stack);
        //释放内存
        // free(mychar);
    }    
}
//返回符号的优先级
int GetPriority(char c){
    if(c=='*' || c=='/') return 2;
    
    if(c=='+' || c=='-') return 1;

    return 0;
}

运算符号操作

//运算符号操作
void operatorOperate(LinkStack *stack, char *p){
    //取出栈顶符号
    MyChar *mychar = (MyChar*)Top_LinkStack(stack);
    //栈为空
    if(mychar==NULL){
        Push_LinkStack(stack,(LinkNode*)CreateMyChar(p));
        return;
    }
    //如果栈顶优先级低于当前符号, 当前符号直接入栈
    if(GetPriority(*(mychar->p)) < GetPriority(*p)){
        Push_LinkStack(stack,(LinkNode*)CreateMyChar(p));
        return;
    }
    //栈顶符号优先级不低, 弹出栈顶符号后进栈
    else{
        while(Size_LinkStack(stack)>0){
            MyChar *mychar2 = (MyChar*)Top_LinkStack(stack);
            //如果栈顶优先级较低, 当前符号入栈
            if(GetPriority(*(mychar2->p)) < GetPriority(*p)){
                Push_LinkStack(stack,(LinkNode*)CreateMyChar(p));
                break;
            } 
            //如果栈顶优先级不低于,弹出
            //输出栈顶
            cout << *(mychar2->p);
            //弹出
            Pop_LinkStack(stack);
            //释放
            free(mychar2);
        }
    }
}

测试

int main(){
    // 8 3 1 - 5 * +
    char *str = "8+(3-1)*5";
    char *p = str;
    //创建栈
    LinkStack* stack = Init_LinkStack();

    while(*p!='\0'){
        //数字, 直接输出
        if(isNumber(*p)){
            numberOperate(p);
        }
        //左括号, 直接进栈
        if(isLeft(*p)){
            leftOperate(stack,p);
        }
        //右括号
        if(isRight(*p)){
            rightOperate(stack,p);
        }
        //如果是运算符号 
        if(isOperator(*p)){
            operatorOperate(stack,p);
        }

        p++;
    }
    //把栈剩余的内容输出并弹出
    while(Size_LinkStack(stack)>0){
        MyChar *mychar = (MyChar*)Top_LinkStack(stack);
        cout << *(mychar->p) << " ";
        Pop_LinkStack(stack);
    }
    
    cout << endl;

    system("pause");
    return 0;
}

标签:LinkStack,符号,后缀,栈顶,MyChar,mychar,stack,表达式
From: https://www.cnblogs.com/HIK4RU44/p/18144352

相关文章

  • 栈5-后缀表达式求解
    栈5-后缀表达式的求解求解过程831-5*+数字:进栈[1,3,8]符号:-从栈中弹出右操作数-1从栈中弹出左操作数3-1根据符号进行运算2将运算结果压入栈中[2,8]遍历结束,栈中唯一的数字作为计算结果定义栈结构typedefstructMYNUM{LinkNodenode;int......
  • 正则表达式
    1.regexp命令 regexp匹配正则表达式与字符串,它的语法为: regexp?switches?expstring?matchvar??subMatchVar...subMatchVar? regexp命令比较字符串string是否与正则表达式exp部分或者全部匹配,并可以将字符串中的子字符串提取出来。如果字符串的某个子字符......
  • Effective Python:第5条 用辅助函数取代复杂的表达式
    初始代码: 第一次优化:多次使用:  ......
  • 后缀数组学习笔记
    定义后缀数组是什么?(下文用\(Suf_S[i]\)表示\(S[i,i+1,\cdots,|S|]\),对\(Suf_T\)同理。并用\(S[l,r]\)表示\(S[l,l+1,\cdots,r]\),对\(T[l,r]\)同理)后缀数组包含两个数组\(rk,sa\)。\(rk[i]\)表示后缀\(Suf_S[i]\)排序后的排名。\(sa[i]\)表示排......
  • 正则表达式
    Python正则表达式Python正则表达式是一种用来匹配和处理字符串的强大工具。Python提供了re模块来支持正则表达式的使用。re模块常用函数re.compile(pattern,flags=0):根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配......
  • 后缀数组学习笔记
    定义后缀从字符串某个位置i到字符串末尾的子串,定义s的第i个字符为第一个元素的后缀为suf(i)。后缀数组把s的每一个后缀按照字典序排序,后缀数组sa[i]表示排名为i的后缀的起始位置的下标。rk[i]数组代表起始位置为i的后缀的排名。rk[]和sa[]是一一对应关系,互为逆运算,可以相互......
  • python3字符串格式化用format()好还是 % 表达式好
    左手编程,右手年华。大家好,我是一点,关注我,带你走入编程的世界。公众号:一点sir,关注领取python编程资料在Python中,使用format()方法是更推荐的方式来进行字符串格式化,特别是在Python3中。虽然%表达式仍然可以在Python中使用,但已经不推荐使用了,新的项目中能不用就不用,谁知道哪......
  • 后缀数组 学习笔记
    理论知识详见OIWiki。模板后缀排序一切有关后缀数组问题的必备板子。求后缀数组模板题,OIWiki有详解。点击查看代码#include<bits/stdc++.h>#defineintlonglong#defineendl'\n'#definesortstable_sortusingnamespacestd;constintN=1e6+10;template......
  • python基础-函数(lambda表达式、函数作参数、内置函数、推导式)和pip
    函数进阶今日概要:函数名就是一个变量(扩展)匿名函数(lambda表达式)重点内置函数——python内置函数推导式(一行代码生成数据)1.函数名就是变量deffunc():passv1=funcv1()func()defregister():...deflogin():...def......
  • 正则表达式中 “$” 并不是表示 “字符串结束
    作者:SethLarson译者:豌豆花下猫@Python猫英文:Regexcharacter“$”doesn'tmean“end-of-string”转载请保留作者及译者信息!这篇文章写一写我最近在用Python的正则表达式模块(re)开发CPython的SBOM工具时发现的一个令人惊讶的行为。如果用过正则表达式,你可能知道^表......