问答详情
源自:4-4 栈应用括号匹配二

标准模板库实现

学了标准模板库,就该用标准模板库解决问题

#include<iostream>

#include<string>

#include<stack>

using namespace std;

char judge(char c)

    {

    char cneed;

    switch(c)

    {

        case '{':cneed='}';break;

        case '[':cneed=']';break;

        case '(':cneed=')';break;

    }

    return cneed;

}

int main()

{

    stack<char> s;

    string brackets;

    cin>>brackets;

    for(int i=0;i<brackets.size();i++)

    {

        if(s.empty())

        {

            s.push(brackets[i]);

            continue;

        }

        judge(s.top())==brackets[i]?s.pop():s.push(brackets[i]);

    }

    s.empty()? cout<<"匹配":cout<<"不匹配";

    return 0;

}

还有更好的写法吗?

提问者:潇潇_暮雨 2018-11-20 20:01

个回答

  • younger_321
    2020-03-18 10:02:27

    // myself void bracketMatch1(const char* str) {	MyStack<char>* pMatch = new MyStack<char>(30);	char currentNeed = 0;	for (int i = 0; i < strlen(str); i++) {		if (str[i] == currentNeed) {			if (pMatch->pop(currentNeed) == 0) currentNeed = 0; 				// 1. 通过pMatch更新当前待匹配括号				// 2. pMatch为空时,需给当前待匹配括号置零		}		else {			if (currentNeed != 0) pMatch->push(currentNeed);			currentNeed = str[i] == '(' ? ')' : (str[i] == '[' ? ']' : 'k');		}	}	pMatch->stackEmpty()&&currentNeed==0 ? cout << "Yes" << endl : cout << "No" << endl;	delete pMatch;	pMatch = nullptr;}


  • 慕粉2224315483
    2019-11-05 23:06:28

    非常好,再加上空格等非括号判断就完美了

  • 树莓酒
    2018-12-20 20:05:33

    #include <iostream>#include <stdlib.h>#include "stack.h"#include "coordinate.h"using namespace std;//函数声明bool BrackerMatch(char *str);//主函数int main(){		/*	栈应用--括号匹配	描述:任意输入一组括号,判断括号是否匹配	*/	char str[]= "([]})";	if (BrackerMatch(str)) {		cout << "括号成功匹配" << endl;	}	else	{		cout << "括号不匹配" << endl;	}	system("pause");	return 0;}bool BrackerMatch(char *str) {	MyStack<char> *p = new MyStack<char>(30);	char e = 0;	for (int i = 0; i < strlen(str); i++)	{		switch(str[i]) {			case '(':				p->push(str[i]);				p->stackTraverse(false);				break;			case '[': p->push(str[i]); break;			case '{': p->push(str[i]); break;			case ')':				if (p->getTopElement()!='(')				{						cout << p->getTopElement() << endl;					return false;				}				else				{						p->pop(e);					break;				}			case ']':				if (p->getTopElement() != '[')				{					return false;				}				else				{					p->pop(e);					break;				}			case '}':				if (p->getTopElement() != '}')				{					return false;				}				else				{					p->pop(e);					break;				}			default:				break;		}	}	return p->stackEmpty();}