一 问题描述:

二 解题思路:

因为要对括号序列进行插入操作,所以选择链表作为序列的数据结构,在判断括号序列是否合法时,要用到堆栈,所以选择堆栈用以存放左半括号

三 代码:

/*
This is a free Program, You can modify or redistribute it under the terms of GNU
*Description:2013年校园招聘--小米笔试题:括号智能纠错问题
*Language: C++
*Development Environment: VC6.0
*Author: Wangzhicheng
*E-mail: 2363702560@qq.com
*Date: 2013/1/6
*/
#include <iostream>
#include <cstdlib>
#include <string>
#include <list>
#include <stack>using namespace std;/*
*定义括号类型
*/
const char T1='(';
const char MT1=')';
const char T2='[';
const char MT2=']';
const char T3='{';
const char MT3='}';class Match {
private:list<char>List;    //字符串组成的链表stack<char>Stack;  //字符栈int cnt;           //添加的括号数  /** 判断字符c1和c2是否匹配*/bool IsMatch(char c1,char c2) {if(c1 == T1 && c2 ==MT1) return true;if(c1 == MT1 && c2 ==T1) return true;if(c1 == T2 && c2 ==MT2) return true;if(c1 == MT2 && c2 ==T2) return true;if(c1 == T3 && c2 ==MT3) return true;if(c1 == MT3 && c2 ==T3) return true;return false;}/** 返回与字符c匹配的字符*/char CharMatch(char c) {if(c == T1) return MT1;if(c == MT1) return T1;if(c == T2) return MT2;if(c == MT2) return T2;if(c == T3) return MT3;if(c == MT3) return T3;}
public:Match(const string &input) {string::const_iterator it;for(it=input.begin();it!=input.end();it++) {List.push_back(*it);}cnt=0;}bool Correct(const string &input,string &result) {list<char>::iterator it;char c;bool match=true;for(it=List.begin();it!=List.end();it++) {if(*it==T1 || *it==T2 || *it==T3) Stack.push(*it);else {if(Stack.empty()==false && IsMatch(*it,Stack.top())) Stack.pop();  //已经匹配/** 此时要么堆栈为空,要么栈顶元素和当前链表元素不匹配* 将与当前链表元素匹配的括号插入链表*/else {match=false;c=CharMatch(*it);List.insert(it,c);      //在当前位置前插入cnt++;}}}/** 此时链表中还有未匹配的括号*/while(!Stack.empty()) {match=false;c=Stack.top();c=CharMatch(c);Stack.pop();List.insert(it,c);cnt++;}for(it=List.begin();it!=List.end();it++) {result+=*it;}return match;}int getCnt() {return cnt;}
};void main() {string input;string result;cout<<"请输入只含[ ] ( ) { }的括号表达式:";cin>>input;string::const_iterator it;for(it=input.begin();it!=input.end();it++) {if(*it==T1 || *it==MT1 || *it==T2 || *it==MT2|| *it==T3 || *it==MT3) continue;else {cerr<<"输入表达式非法!"<<endl;exit(1);}}Match match(input);if(!match.Correct(input,result)) {cerr<<"原表达式括号不匹配!"<<endl;cout<<"纠错后的表达式是:"<<result<<endl;cout<<"添加的括号数是:";cout<<match.getCnt()<<endl;}else cout<<"原表达式括号匹配!"<<endl;
}

四 测试:

小米校园招聘笔试题--括号智能纠错相关推荐

  1. 2015去哪儿、大众点评、搜狗、小米校园招聘笔试题

    去哪儿 大众点评 1.有10个文件,每个文件1G,每个文件的每一行存放的都是用户的query,每个文件的query都可能重复.要求你按照query的频度排序. hash映射: 1.顺序读取10个文件, ...

  2. 2013年小米校园招聘笔试题

    ---------------------------------------------------------------------------------------------------- ...

  3. 2013年小米校园招聘笔试题---研发

    3.朋友圈(25分) 假如已知有n个人和m对好友关系(存于数字r).如果两个人是直接或间接的好友(好友的好友的好友...),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共有多少个朋友圈.    ...

  4. 2015小米校园招聘笔试题

    1.判断一个数字是否为回文数字 想了半天也没想出什么特别好的办法,用最原始的办法做的 2.写一个多项式相乘的算法 输入格式比较奇葩,需要用库函数处理 C++的string的函数我都没记得,只好用Jav ...

  5. 2013 小米校园招聘笔试题之 找异形数

    异形数: 在一个长度为n的整形数组a里,除了三个数字只出现一次外,其他的数字都出现了2次.请写程序输出任意一个只出现一次的数字,程序时间和空间复杂度越小越好. 例如: a = {1,3,7,9,5,9 ...

  6. 2013年小米校园招聘笔试题-朋友圈

    3.朋友圈(25分) 假如已知有n个人和m对好友关系(存于数字r).如果两个人是直接或间接的好友(好友的好友的好友...),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共有多少个朋友圈. 假如 ...

  7. 2013年小米校园招聘笔试题(三)

    如上题目,自己设计的代码如下: /*You can mail me :wshust2007@163.com这个问题的基本思路如下:1.根据相互间的朋友关系, 二维的bitmap ,根据本题的已知条件, ...

  8. 2012九月十月腾讯,网易游戏,百度最新校园招聘笔试题

    十月下旬腾讯,网易游戏,百度最新校园招聘笔试题集锦(第271-330题) 引言 此文十月百度,阿里巴巴,迅雷搜狗最新面试十一题已经整理了最新的面试题70道,本文依次整理腾讯,网易游戏,百度等各大公司最 ...

  9. 2014 WAP校园招聘笔试题

    2014 WAP校园招聘笔试题 Problem's Link:   http://www.doc88.com/p-6751117015483.html WAP公司笔试题 We are planning ...

最新文章

  1. [Android]手动触发OnClick事件
  2. LSTM如何解决梯度消失或爆炸的?
  3. for in 和 for of 的区别
  4. BusinessSkinForm使用
  5. 安卓BLE开发教程(一) BLE基础
  6. hub设备_外设再多也不怕,ORICO 7口HUB测评
  7. MyBatisPlus自动生成代码springboot+mybatis+mysql 以及动态sql生成方法(测试可用版)
  8. Java习题>|异常>|throw自定义异常小案例
  9. fread函数 linux在哪,fread函数返回值
  10. ssb的有效性最好_在AM、DSB、SSB、FM系统中,有效性最好的是AM
  11. python -pandas
  12. Ubuntu16.04 安装Pangolin出现错误,已解决(亲测成功)
  13. 历史名酒元氏益成永——宋曹贡酒
  14. Latex中参考文献的写作方法
  15. 商城后台管理系统学习日志-03
  16. magento打印订单里面添加运输方式
  17. 东芝Boot Speed设置成Fast,如何再次进入bios设置。
  18. html5如何复制上一行代码,eclipse快速复制一行代码(向下/向上)快捷键修改设置...
  19. ERP项目售前需求调研提纲
  20. NTC负温度系数的热敏电阻——通过ADC检测计算出相应温度值

热门文章

  1. SolidEdge 如何绘制剖视图
  2. 小程序发送模板消息小结
  3. 让iphone可装android双启动,iPhone 4可安Android实现双系统启动
  4. linux xampp php5.6,xampp for linux
  5. 京东在2018年成为Intel全球最大PC零售渠道
  6. lenovo L480 进入bios_部分用户更新系统后提示“自动修复”,无法进入系统
  7. AutoSAR系列讲解(入门篇)3.1-RTE概述
  8. 数据结构系列之B树、B+树、B*树
  9. Layui表格优化(表格显示内容后面加 元 或者其他文字或符号)
  10. SD卡CMD命令介绍