写bug之前我就知道这样偷懒有问题,结果i++就放错了地方。

我以后不 有意识的写bug了。

把原来的代码  把重复的代码 用函数去表示后, 我华为的第三题就出来了。
立贴,以后别偷懒。。



#include<iostream>
#include<string>
#include<stack>
#include<unordered_map>
#include<vector>
using namespace std;
int doSometing(string str);
void single(stack<int>& st_num, stack<char>& st_syl, string& str, int i){
	int help = st_num.top(); st_num.pop();
	help = !help;
	st_num.push(help);
	st_syl.pop();
	st_syl.push(str[i]);
}
void two(stack<int>& st_num, stack<char>& st_syl, string& str, int i){
	int l1 = st_num.top(); st_num.pop();
	int l2 = st_num.top(); st_num.pop();
	l1 = l1 & l2;
	st_num.push(l1);
	st_syl.pop();
	st_syl.push(str[i]);
}
int main(){
	char arr[1000];
	// 	cin.getline(arr,1000);
	// string str = arr;
	// cout << doSometing(str);
	cout << doSometing("((!0&1))|((0))");
	return 0;
}

int doSometing(string str){
	int i=0;
	stack<char> st_syl;
	stack<int> st_num;
	stack<int> st_kuo;// 存括号的位置
	// cout << "begin : str :" << str <<endl;
	while(i<str.size()){
		// cout << "i :" << i << "  value "  << str[i] <<endl; 
		if(str[i] == '('){
			st_kuo.push(i);
			i++;
		}else if(str[i] == ')'){
			cout << endl;
			cout << "*********************"<<endl<<endl;;
			int pos = st_kuo.top(); st_kuo.pop();
			int length = i - pos +1 - 2;
			string next_str = str.substr(pos+1, length);
			cout << "old_str : " << str << endl;
			cout << "recur_str : " << next_str << endl;
			int ans = doSometing(next_str);
			cout << "recur_answer is " << ans <<endl; 
			// cout << "length is : " << length << endl;
			// cout << "now i ----> " << i <<endl;
			str.replace(pos, length+2, to_string(ans));  // 重叠括号情况
			cout << "new_str : " << str << endl;
			st_num.push(ans);
			i = i - length;
		}else{
			if(!st_kuo.empty()){
				i++;
			}else{
				if(str[i]=='!'|| str[i]=='&'|| str[i]=='|'){
					// 是字符
						if(st_syl.empty()){
							st_syl.push(str[i]);
						}else{
							if(st_syl.top() == '!'){
								single(st_num, st_syl, str, i);
							}else if(st_syl.top() == '&' && (str[i] == '|' || str[i] == '&&')){
								two(st_num, st_syl, str, i);
							}else if(st_syl.top() == '|' && str[i] == '|'){
								two(st_num, st_syl, str, i);
							}else{
								st_syl.push(str[i]);
							}
						}
						i++;
						}else{
							// 是‘’数字
							st_num.push(str[i]-'0');
							i++;
						}			
			}
		}
	}
	while(!st_syl.empty()){
		char c = st_syl.top(); st_syl.pop();
		if(c == '!'){
			int help = st_num.top(); st_num.pop();
			help = !help;
			st_num.push(help);
		}else{
			int l1 = st_num.top(); st_num.pop();
			int l2 = st_num.top(); st_num.pop();
			if(c == '&'){
				l1 = l1 & l2;
			}else{
				l1 = l1 | l2;
			}
			st_num.push(l1);
		}
	}
	return st_num.top();
}






#华为##笔试题目#
全部评论
请问能说下题目嘛?楼主
点赞 回复 分享
发布于 2019-08-07 22:39

相关推荐

头像
11-06 10:58
已编辑
门头沟学院 嵌入式工程师
双非25想找富婆不想打工:哦,这该死的伦敦腔,我敢打赌,你简直是个天才,如果我有offer的话,我一定用offer狠狠的打在你的脸上
点赞 评论 收藏
分享
评论
1
1
分享
牛客网
牛客企业服务