问题:括号匹配
方法:栈
思路分析:
核心思想: 利用栈的性质,先进后出,遇到左括号则压入栈,遇到右括号则与栈顶元素匹配,若匹配成功则将栈顶元素弹出,反之返回false。
匹配方法: 利用map建立哈希表,实现括号一一对应关系。
两种特殊错误情况:
C++实现:
class Solution {
public:
bool isValid(string s) {
//使用map创建哈希表
map<char,char> wordbook;//建立哈希表
wordbook.insert(map<char,char>::value_type(')','('));
wordbook.insert(map<char,char>::value_type(']','['));
wordbook.insert(map<char,char>::value_type('}','{'));
stack<char>mystack; //创建一个栈
//遍历字符串
for(int i=0; i<s.length(); i++){
//如果是左括号,压入栈中
if(s[i]=='(' || s[i]=='[' || s[i]=='{') mystack.push(s[i]);
//如果是右括号,与栈顶元素匹配
else if(s[i]==')' || s[i]==']' || s[i]=='}'){
if(mystack.empty()) return false; //匹配前判断栈是否为空,若为空,直接false
//匹配的时候右括号要与对应的左括号匹配,使用map建立哈希表实现左右括号的一一对应
if (wordbook[s[i]] == mystack.top()){
mystack.pop();//匹配成功时删除栈顶元素,pop()函数
continue;
}
else return false;
}
}
//遍历完字符串,如果栈非空,返回false
if(mystack.empty()) return true;
else return false;
}
};
C++栈基础知识回顾:
c++stack(堆栈)
它是一个容器的改编,实现了一个先进后出的数据结构(FILO)
使用该容器时需要包含#include<stack>头文件;
定义stack对象的示例代码如下:
stack<int>s1; //栈中元素的数据类型为int
stack<string>s2; //栈中元素的数据类型为字符串
stack的基本操作包括:
1.入栈: s.push(x);
2.出栈: s.pop(). 出栈操作只是删除栈顶的元素,并不返回该元素。
3.访问栈顶 s.top();
4.判断栈空: s.empty(). 栈空时返回true。
5.访问栈中的元素个数,s.size();
简单示例代码:
#include<iostream>
#include<stack>
using namespace std;
int main(void)
{
stack<double>s;//定义一个栈
for (int i = 0; i<10; i++)
s.push(i);
while (!s.empty())
{
printf("%lf\n", s.top());
s.pop();
}
cout << "栈内的元素的个数为:" << s.size() << endl;
system("pause");
return 0;
}