#include <stdio.h> #include <stdlib.h> #define BASE_SIZE 5000 struct bracket_stack { char bracket[BASE_SIZE]; int top; }; void init_stack(struct bracket_stack **p) { *p = (struct bracket_stack *)malloc(sizeof(struct bracket_stack)); (*p) ->top = -1; } int is_empty(struct bracket_stack *p) { return p->top == -1; } void push(struct bracket_stack **p, char c) { (*p)->top++; (*p)->bracket[(*p)->top] = c; } char get_top(struct bracket_stack *p) { return p->bracket[p->top]; } char pop(struct bracket_stack *p) { p->top--; return p->bracket[p->top + 1]; } int main() { struct bracket_stack *s; char c; init_stack(&s); while ((c = getchar()) != ' ') { if (c == '(' || c == '[') { push(&s, c); } if (c == ')') { if (!is_empty(s) && get_top(s) == '(') { pop(s); } else { printf("不匹配"); return 0; } } if (c == ']') { if (!is_empty(s) && get_top(s) == '[') { pop(s); } else { printf("不匹配"); return 0; } } } if (!is_empty(s)) { printf("不匹配"); } else { printf("匹配"); } return 0; }
首先是遍历字符串,如果是左括号,就压栈。
如果是右括号,就去看栈顶元素是都匹配,但是看栈顶元素之前要先判断栈是不是空的。
如果是匹配的,就弹栈,看下一个括号;如果不匹配,就肯定不匹配,不用往下看了。
最后看栈是否为空的,如果不为空就是左括号多了,肯定不匹配。
一共四种情况:
([])
[[))
[[[[]]]]]]]]]]]]
[[[[[[[[[[[[[[[[[]]]]
------------------
使用c++ STL的情况
#include <iostream> #include <stack> #include <string> using namespace std; int main() { stack<char> s; string str; cin >> str; for (int i = 0; i < str.size();i++) { if (str[i] == '(' || str[i] == '[') { s.push(str[i]); } if (str[i] == ')') { if (!s.empty() && s.top() == '(') { s.pop(); } else { cout << "不匹配" << endl; return 0; } } if (str[i] == ']') { if (!s.empty() && s.top() == '[') { s.pop(); } else { cout << "不匹配" << endl; return 0; } } } if (s.empty()) { cout << "匹配" << endl; } else { cout << "不匹配" << endl; } return 0; }
---------------
Issues:
非stl的那种,其实没有必要去使用二级指针
[]()这种也是提示匹配的,但是应该匹配么?
malloc后没有free