数据结构实验之栈二:一般算术表达式转换成后缀式(手写栈)

本文介绍如何将一般算术表达式转换为后缀式。通过手动实现栈的数据结构,详细阐述了处理括号、加减乘除运算符的具体步骤。包括优先级判断与出栈操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据结构实验之栈二:一般算术表达式转换成后缀式

Time Limit: 1000MS Memory limit: 65536K

题目描述

对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。

输入

输入一个算术表达式,以‘#’字符作为结束标志。

输出

输出该表达式转换所得到的后缀式。

示例输入

a*b+(c-d/e)*f#

示例输出

ab*cde/-f*+


解析: 其实对于栈的操作,大家更喜欢用stl,但是手写栈也是很重要的,可以让我们了解栈的内部操作;
对于这个题来说不用栈也行,用树的后序遍历更好。
讲一下核心内容:(1)、遇到字母一律输出;
(2)、遇到左括弧一律入栈;
(3)、遇到右括弧就把两个括弧之间的所有符号出栈输出,并且左括弧出栈;
(4)、遇到“+”或“-”,如果栈不空并且栈顶不是左括弧就出栈输出这一个栈顶,“+”或“-”入栈;
(5)、遇到“*”或“/”,如果栈不空并且栈顶不是左括弧并且栈顶是“*”或“/”,就把栈顶出栈输出,“*”或“/”入栈;
这是操作步骤,想问“+”、“-”、“*”、“/”为什么操作不一样,那就是符号优先级的问题了。
  ///***********代码
#include <stdio.h>  
#include <stdlib.h>  
#define maxstact 1000  
  
typedef char elemstack;  
typedef struct  
{  
    elemstack *top;  
    elemstack *base;  
    int sizestack;  
} Sq;  
int initstack(Sq &L)  
{  
    L.base=new elemstack[maxstact];  
    if(!L.base)  
        exit(0);  
    L.top=L.base;  
    L.sizestack=maxstact;  
}  
int push(Sq &L,char s)  
{  
    if(L.top-L.base>L.sizestack)  
        return -1;  
    *(L.top++)=s;  
    return 0;  
}  
int pop(Sq &L)  
{  
    if(L.top<=L.base)  
        return -1;  
    printf("%c",*(--L.top));  
}  
int main()  
{  
    Sq L;  
    char a[1000],*s;  
    int i;  
    gets(a);  
    initstack(L);  
    for(i=0; a[i]!='#'; i++)  
    {  
        switch(a[i])  
        {  
        case '(':  
            push(L,a[i]);  
            break;  
        case ')':  
        {  
            while(L.top>L.base&&*(L.top-1)!='(')  
                pop(L);  
            L.top--;  
            break;  
        }  
        case '+':  
        {  
            if(L.top>L.base&&*(L.top-1)!='(')  
                pop(L);  
            push(L,a[i]);  
            break;  
        }  
        case '-':  
        {  
            if(L.top>L.base&&*(L.top-1)!='(')  
                pop(L);  
            push(L,a[i]);  
            break;  
        }  
        case '*':  
        {  
            if(L.top>L.base&&*(L.top-1)!='('&&(*(L.top-1)=='*'||*(L.top-1)=='/'))  
                pop(L);  
            push(L,a[i]);  
            break;  
        }  
        case '/':  
        {  
            if(L.top>L.base&&*(L.top-1)!='('&&(*(L.top-1)=='*'||*(L.top-1)=='/'))  
                pop(L);  
            push(L,a[i]);  
            break;  
        }  
        default:  
        {  
            printf("%c",a[i]);  
            break;  
        }  
        }  
    }  
    while(L.top>L.base)  
    {  
        pop(L);  
    }  
    return 0;  
}  
  
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值