由于本人博主懒得写c语言的底层栈,所以我直接使用c++中的已经实现了底层栈结构的stack
#include<iostream>
#include<stack>
using namespace std;
bool compared(stack<char>& st, string s) {
if (s.size() % 2 != 0) return false;
for (int i = 0; i < s.size(); i++) {
if (s[i] == '(' || s[i] == '[' || s[i] == '{') {
st.push(s[i]);
}else
{
if (st.empty())return false;//证明没有可以入栈的,栈中为空,也就是说全部为右括号
if ((s[i] == ')' && st.top() == '(') || (s[i] == ']' && st.top() == '[')|| (s[i] == '}' && st.top() == '{')) {
st.pop();
}
}
}
if (st.empty()) return true;
else return false;
}
int main() {
stack<char> st;
string s;
cin >> s;
cout<<compared(st, s)<<endl;
return 0;
}
基本思想:如果在字符串中遇到了'(','[','{‘(也就是左括号),进行入栈,改写栈顶指针
如果遇到右括号就拿栈顶元素和所遇到的右括号进行配对,如果配对成功进行弹栈,如果最后栈结构为空,则说明括号全部匹配完成,则括号是合法的
或者非法
bool函数那个传引用的作用是防止发生浅拷贝,导致数据芜杂和内存的占用
这里采用string是因为string在c++中也属于一种stl结构,当然大家也可以使用指针类型的字符数组
例如:char *s;