刷题:栈
题目:
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例:
输入: "()" 输出: true
输入: "()[]{}" 输出: true
输入: "(]" 输出: false
输入: "([)]" 输出: false
输入: "{[]}" 输出: true
思路:
满足先进后出的规则,符合栈的原理。但由于之前只是学过栈,没有实际写过程序,所以打算写个程序练习。
程序:
#include <vector>
#include <iostream>
#include <stdlib.h>
#include <string>
#include <stack>
using namespace std;
bool stack_test(string s);
int main()
{
string s;
cin >> s;
if (stack_test(s))
cout << "TRUE" << endl;
else
cout << "FALSE" << endl;
system("pause");
return 0;
}
bool stack_test(string s)
{
stack<char> res;
for (int i = 0; i != s.size(); i++)
{
if (s[i] == '(') //如果是'(',则存入栈
res.push('(');
else if (s[i] == ')') //如果是')',则判断栈是否为空和或栈顶是否为(
{
if (res.empty()) //栈为空,返回false
return false;
else if (res.top() != '(') //栈顶不是(,返回false
return false;
else
res.pop(); //都不是,说明配对了,则删除栈顶元素
}
else if (s[i] == '[') //[同上
res.push('[');
else if (s[i] == ']')
{
if (res.empty())
return false;
else if (res.top() != '[')
return false;
else
res.pop();
}
else if (s[i] == '{') //{ 同上
res.push('{');
else if (s[i] == '}')
{
if (res.empty())
return false;
else if (res.top() != '{')
return false;
else
res.pop();
}
}
if (res.empty()) //如果栈为空,说明所有括号都匹配了,返回true
return true;
else
return false; //栈不为空,有括号没有匹配,返回false
}