匹配括号的判定
内存限制: 256 Mb时间限制: 1000 ms
题目描述
给定一个由 (,),[ 与 ] 构成的括号字符串,请判断它是否是匹配的,匹配的定义如下:
[] 与 () 是匹配的;
如果字符串 s 是匹配的,那么 [s] 与 (s) 都是匹配的;
如果字符串 ss 与 tt 都是匹配的,那么 s\cdot ts⋅t 也是匹配的。
输入格式
单独一个字符串:表示输入的序列。
输出格式
如果输入字符串是匹配的,输出 Balanced,否则输出 Unbalanced。
数据范围
设 nn 表示输入字符串的长度
对于 50%50% 的数据,1\leq n\leq 1,0001≤n≤1,000;
对于 100%100% 的数据,1\leq n\leq 1,000,0001≤n≤1,000,000;
样例数据
输入:
[(])
输出:
Unbalanced
输入:
[()]
输出:
Balanced
用栈,如果是左括号就入栈,如果右括号就栈顶元素出栈,判断是否匹配,直到整个字符串匹配完成。
有问题请回复
#include <iostream>
#include <malloc.h>
#define MAXSIZE 100
using namespace std;
char s[1000000];
typedef char datatype;
typedef struct seqstack
{
datatype elem[MAXSIZE];
int top;
} seqstack;
void init(seqstack *s)
{
s->top=-1;
}
int empty(seqstack s)
{
return(s.top==-1? 1:0);
}
void push(seqstack *s,datatype x)
{
if(s->top==MAXSIZE-1)
{
exit(1);
}
s->top++;
s->elem[s->top]=x;
}
datatype pop(seqstack *s)
{
datatype x;
if(s->top==-1)
{
exit(1);
}
x=s->elem[s->top];
s->top--;
return x;
}
int match_kuohao(char c[])
{
int i=0;
seqstack *s;
s=(seqstack *)malloc(sizeof(seqstack));
init(s);
while(c[i]!='\0')
{
switch(c[i])
{
case '{':
case '[':
case '(':
push(s,c[i]);
break;
case '}':
if(!empty(*s) && pop(s)=='{' ) break;
else return 0;
case ']':
if(!empty(*s) && pop(s)=='[' ) break;
else return 0;
case ')':
if(!empty(*s) && pop(s)=='(' ) break;
else return 0;
}
i++;
}
return (empty(*s)==1);
}
int main()
{
int t=0;
while((s[t] = getchar()) != '\n')
{
t++;
s[t] = '\0';
}
if(match_kuohao(s))
{
cout<<"Balanced";
}
else
{
cout<<"Unbalanced";
}
return 0;
}
你看看https://zhuanlan.zhihu.com/p/31574601
#include <iostream>
#include <stack>
int main()
{
std::stack<char> stack;
char ch;
bool unbalanced = false;
while ((ch = getchar()) != EOF)
{
if (ch == '(' || ch == '[')
{
stack.push(ch);
}
else if (ch == ')' || ch == ']')
{
if (!stack.empty() && stack.top() == ch)
{
stack.pop();
}
else
{
unbalanced = true;
break;
}
}
}
if (unbalanced || !stack.empty())
std::cout << "Unbalanced";
else
std::cout << "Balanced";
return 0;
}