代码随想录算法训练营Day11 | 20.有效的括号、1047.删除字符串中的所有相邻重复项、150.逆波兰表达式求值

20.有效的括号

整理好不匹配的情况有哪些种类,写代码就顺畅了。使用栈进行实现还是比较简单的。

不匹配的情况:

1、匹配错误
2、左括号多了——最后栈中还有元素剩余
3、右括号多了——需要匹配但栈是空的

// 将需要匹配的左括号存入栈
// 遇到右括号时将栈顶弹出并与右括号匹配
// 如果匹配失败或是最后栈中还有元素剩下说明字符串不是有效的
bool isValid(string s) {
	// 可以进行剪枝:如果字符串长度是奇数,则一定有不匹配的括号
	if (s.size() % 2 == 1)
		return false;

	stack<char> parentheses;
	for (char c : s) {
		if (c == '(')
			parentheses.push(')');
		else if (c == '{')
			parentheses.push('}');
		else if (c == '[')
			parentheses.push(']');

		if (c == ')') {
			if (parentheses.empty() || parentheses.top() != c)
				return false;
			else
				parentheses.pop();
		}
		else if (c == '}') {
			if (parentheses.empty() || parentheses.top() != c)
				return false;
			else
				parentheses.pop();
		}
		else if (c == ']') {
			if (parentheses.empty() || parentheses.top() != c)
				return false;
			else
				parentheses.pop();
		}
	}
	// 处理多余左括号情况
	return parentheses.empty();
}

1047.删除字符串中的所有相邻重复项

 题目与栈的机制十分契合。

使用栈进行实现:

// 将字符串中的元素逐个存入栈
// 如果存入时发现字符与栈顶字符相同则不存入并将栈顶弹出
// 最后将栈元素逐个弹出组成结果字符
string removeDuplicates(string s) {
	stack<char> st;
	string ans;
	for (char c : s) {
		if (!st.empty() && st.top() == c)
			st.pop();
		else
			st.push(c);
	}
	while (!st.empty()) {
		ans = st.top() + ans;
		st.pop();
	}
	return ans;
}

使用字符串结构模拟栈进行实现,字符串尾模拟栈顶

string removeDuplicates(string s) {
	string ans = "";
	for (char c : s) {
		if (!ans.empty() && ans.back() == c)
			ans.pop_back();
		else
			ans.push_back(c);
	}
	return ans;
}

 150.逆波兰表达式求值

理解了逆波兰表达式的规则,按规则写就行,比较简单。

忘记了有stoi库函数,还多写了一步将字符串转换为整型字符的函数

// 字符串转换为整型数字
int stringToInt(string s) {
	int k = 1;
	int res = 0;

	for (int i = s.size() - 1; i >= 0; --i) {
		if (s[i] == '-')
			return -res;
		res += (s[i] - '0') * k;
		k *= 10;
	}
	return res;
}


// 按规则写就行,注意细节
int evalRPN(vector<string>& tokens) {
	stack<int> st;
	int temp;
	for (string s : tokens) {
		if (s == "+") {
			temp = st.top();
			st.pop();
			st.top() += temp;
		}
		else if (s == "-") {
			temp = -st.top();
			st.pop();
			st.top() += temp;
		}
		else if (s == "*") {
			temp = st.top();
			st.pop();
			st.top() *= temp;
		}
		else if (s == "/") {
			temp = st.top();
			st.pop();
			st.top() /= temp;
		}
		else {
			// 使用库函数stoi即可
			// st.push(stoi(s));
			st.push(stringToInt(s));
		}
	}

	return st.top();
}

这些题知道使用栈来实现都不难,但是看到题目如何反应过来要使用栈来做呢? 

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值