uva 11234 - Expressions

本文介绍了一种使用队列替代栈构建表达式树的方法,并通过层次遍历输出结果。具体步骤包括:解析输入表达式,用栈构建表达式树,再利用队列进行层次遍历并输出结果。

点击打开链接


题目意思:给定一个字符串表示是一个表达式,要求使用队列代替栈的方法来输出结果。


解题思路:我们知道对于这个表达式,最后一个肯定是大写字母,对于每一个大写字母会跟着两个小写的字母或大写字母,那我们联想到二叉树,我们可以建立一颗二叉表达式的树,怎么建呢,一下代码详解,最后我们只要从最后一层从左往右这样输出即可,要求用到树的层次遍历(就是广搜),同时需要用一个list来存储节点的值,最后输出list即可


代码:




#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <list>
#include <stack>
#include <queue>
#include <algorithm>
using namespace std;
const int MAXN = 10010;

//树的结构
struct Btree{
    char val;
    Btree *lchild;
    Btree *rchild;
    Btree *father;
};
Btree *root ;
char expre[MAXN];//表达式数组
int t ;
list<char>l;//链表存储结果
queue<Btree*>q;//队列用来广搜
stack<Btree*>s;//栈用来建树

//节点初始化函数
void init(Btree *u , char c){
    u->val = c;
    u->lchild = NULL;
    u->rchild = NULL;  
}
//输出函数
//我们利用队列进行树的层次遍历,但是每次都先遍历右儿子,把右儿子的值存入list中,记住是往前插入,最后输出即可
void output(Btree *root){
    q.push(root);
    l.push_front(root->val);
    while(!q.empty()){
        root = q.front();
        q.pop();
        if(root->lchild != NULL || root->rchild != NULL){//只要不为空就要进行插入操作,先访问右节点
           if(root->rchild != NULL){//如果右儿子不为空,把右儿子push进队列中 ,并且则把右儿子的值插入list中
               q.push(root->rchild);
               l.push_front(root->rchild->val);
           }
           if(root->lchild != NULL){//如果左儿子不为空,把左儿子push进队列中 ,并且则把左儿子的值插入list中
               q.push(root->lchild);
               l.push_front(root->lchild->val);
           }
        }
    }
    list<char>::iterator it;//一个list迭代器来输出
    for(it = l.begin() ; it != l.end() ; it++)
        cout<<*it;
    cout<<endl;
}

//建树函数、
//从左往右,我们知道大写字母一定是某一颗子树的根节点,那么我们从左到右,是小写字母就建立一个点并把值赋给它,然后把节点压入栈中,当遇到大写字母时,建立根节点,把栈中的两个节点分别赋为该根节点的儿子,并且出栈,同时把次根节点如栈,更新root,直到最后一个
void solve(){
    Btree *temp;
    root = new Btree;//分配空间,记住没有分配空间是不能赋值的
    char ch;
    for(int i= 0 ; i != strlen(expre) ; i++){
        if(islower(expre[i])){//小写字母
           temp = new Btree;//建立一个临时的Btree*
           init(temp , expre[i]);//赋值函数
           s.push(temp);//压入栈
        }
        else{
            temp = new Btree;
            init(temp , expre[i]);//建立根节点
            temp->lchild = s.top();//左儿子为栈顶
            s.pop();//清除栈顶
            temp->rchild = s.top();//右儿子为栈顶
            s.pop();//清除栈顶
            if(i != strlen(expre)-1)//如果不是最后一个就把根节点入栈
                s.push(temp);
            root = temp;//更新root
        }
    }
    output(root);
    while(!q.empty())//注意队列的情空
        q.pop();
    l.clear();//注意对list的清空
}

//主函数
int main(){
    cin>>t;
    getchar();
    while(t--){
        gets(expre);
        solve();
    }
    return 0;
}




<think>好的,我现在需要帮助用户解决关于ESLint的no-unused-expressions规则的配置问题。用户提到可能涉及ESLint规则或其他代码检查工具的配置需求,所以首先要确认这个规则的具体情况。 首先,我回忆一下no-unused-expressions规则的作用。这个规则主要是用来检查代码中是否有未使用的表达式,也就是那些没有对程序状态产生任何影响的表达式。比如,用户可能写了类似`a + b;`这样的语句,虽然计算了a和b的和,但没有赋值给变量或用于其他操作,这样的表达式就是未使用的,可能会被此规则检测到并报错。 接下来,我需要考虑用户可能遇到的常见场景。例如,使用Chai.js这样的测试库时,可能会写出`expect(...).to.be.true;`这样的断言语句。这些语句在ESLint默认配置下可能被标记为未使用的表达式,导致错误。因此,用户可能需要调整规则配置来允许这种情况。 根据引用内容,用户之前提到过使用eslint-config-prettier来禁用格式相关的规则,但这里的问题是关于未使用表达式的,属于逻辑层面的规则,所以需要直接配置ESLint的规则而不是通过Prettier处理。 用户可能已经在使用create-react-app,而引用中提到的方案三使用了react-app-rewired和customize-cra来覆盖配置。这时候,用户可能需要通过修改ESLint配置文件来调整规则设置,而不需要eject项目。 接下来,我需要整理配置这个规则的具体步骤。通常,在.eslintrc文件中,可以通过rules字段来设置。对于no-unused-expressions,需要允许某些表达式(如测试中的断言),可能需要设置allowTernary或者allowShortCircuit等选项。例如: { "rules": { "no-unused-expressions": ["error", { "allowShortCircuit": true, "allowTernary": true, "allowTaggedTemplates": false }] } } 另外,针对特定库如Chai.js,可能需要使用eslint-plugin-chai来解决,或者在规则中添加allow选项。例如使用插件后配置: { "plugins": ["chai-friendly"], "rules": { "no-unused-expressions": "off", "chai-friendly/no-unused-expressions": "error" } } 同时,用户可能需要知道如何在create-react-app项目中应用这些配置,尤其是如果项目是基于react-scripts的话。根据引用中的方案三,使用react-app-rewired来覆盖配置,可以修改config-overrides.js文件,将自定义的ESLint配置合并进去。 最后,要提醒用户注意版本兼容性,比如引用中提到react-app-rewired适用于4.x以下的版本,如果用户使用的是更高版本可能需要其他方法。此外,测试配置是否生效的方法,比如运行ESLint命令检查,或者查看IDE的错误提示是否消失。</think>### ESLint no-unused-expressions 规则配置解决方案 #### 规则定义作用 `no-unused-expressions` 是 ESLint 核心规则之一,用于检测代码中未产生实际作用的表达式(例如未赋值或未参逻辑判断的数学运算)。该规则可避免因冗余代码导致的可读性问题和潜在错误。 #### 典型应用场景 1. 单元测试框架中的断言表达式(如 `expect(...).to.be.true`) 2. JavaScript 短路表达式(如 `a || b`) 3. 三元运算符表达式(如 `condition ? action1() : action2()`) #### 配置方法 通过 `.eslintrc` 配置文件进行设置,支持以下参数: ```json { "rules": { "no-unused-expressions": ["error", { "allowShortCircuit": true, // 允许短路表达式 "allowTernary": true, // 允许三元运算符 "allowTaggedTemplates": false // 是否允许标记模板字符串 }] } } ``` #### 测试框架特殊配置 使用 Chai.js 等断言库时,建议安装专用插件: ```bash npm install eslint-plugin-chai-friendly --save-dev ``` 配置示例: ```json { "plugins": ["chai-friendly"], "rules": { "no-unused-expressions": "off", "chai-friendly/no-unused-expressions": "error" } } ``` #### 在 Create-React-App 中的实现 通过 `react-app-rewired` 覆盖默认配置(适用 react-scripts 4.x 以下版本): 1. 修改 `config-overrides.js`: ```javascript const { override, useEslintRc } = require('customize-cra'); module.exports = override(useEslintRc()); ``` 2. 创建 `.eslintrc` 文件写入自定义规则[^2][^3] #### 验证配置有效性 ```bash npx eslint yourfile.js # 或查看 IDE 的 ESLint 错误提示 ``` #### 注意事项 1. 新版 react-scripts (5.0+) 使用 `ESLINT_NO_DEV_ERRORS=true` 环境变量控制检查强度[^1] 2. Prettier 配合时需确保 `eslint-config-prettier` 正确安装[^1]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值