Leetcode 第四章 栈和队列 --4.1栈--4.1.1Valid Parentheses--2017-7-27

来源:互联网 发布:淘宝联盟能用电脑吗 编辑:程序博客网 时间:2024/04/30 17:01

 问题描述:

Given a string containing just the characters '('')''{''}''[' and ']', determine if the input string is valid.

The brackets must close in the correct order, "()" and "()[]{}" are all valid but "(]" and "([)]" are not.


问题1:什么是Valid Parentheses?

有效的括号。


问题2: for (auto c:s)啥意思

简单来说, s是字符串, 它是由字符组成的, 所以基于范围的for会识别出来 c 是字符类型.

问题3:string中的find函数

string中 find()的应用,

结果:找到 -- 返回 第一个字符的索引
 没找到--返回   string::npos


栈知识点:数据结构、算法与应用 C++语言描述P175,该书中还有类似的例子P184

C++程序设计语言(第4部分:标准库)P54

线性表是一种常用的数据结构。在实际应用中,线性表都是以、队列、字符串数组等特殊线性表的形式来使用的。由于这些特殊线性表都具有各自的特性,因此,掌握这些特殊线性表的特性,对于数据运算的可靠性和提高操作效率都是至关重要的。线性表是一个线性结构,它是一个含有n≥0个结点的有限序列,对于其中的结点,有且仅有一个开始结点没有前驱但有一个后继结点,有且仅有一个终端结点没有后继但有一个前驱结点,其它的结点都有且仅有一个前驱和一个后继结点。


解答及测试代码

#include <stack>
#include <iostream>
#include <string>
using namespace std;

class Solution{
public:
bool isValid(string const& s){
string left = "([{";
string right = ")]}";
stack<char> stk;      //声明栈


for (auto c : s){      //针对函数输入的字符串而言,针对字符串中的每一个字符
if (left.find(c) != string::npos){   //find()返回第一个找到的索引,若没找到返回string::npos
stk.push(c);   //将元素压入栈顶,找到了([{这样的,就压入栈顶
}
else {     //相当于没在left中找到
if (stk.empty() || stk.top() != left[right.find(c)])  //top返回栈顶元素,empty()判断是否为空,若左右不匹配也错
return false;  //没问题,因为题干中指的是containing just the characters.....,所以第一个不属于left,就错误
else
stk.pop();  //删除栈顶元素,也就是说上面这一关过了,之后,就得把这个括号的东西删除掉,继续找下一个字符
}
}


return stk.empty();  //最后看stk是否清空,若清空了,就说明一一对应,就没问题了


}
};


int main(){
string A = "()[]";
string B = "([])";
string C = "([)]";
Solution mySolution;
cout << mySolution.isValid(C) << endl;
return 0;
}



原创粉丝点击