题目描述
判断仅由小括号组成的字符串是否满足括号匹配规则
输入格式
输入包括多行,每行一个仅有小括号组成的字符串,长度不超过100
输出格式
输出包括多行,如果对应的输入括号匹配,输出YES,否则输出NO
输入样例
()()()
((()))
())(
((()
输出样例
YES
YES
NO
NO
这个题实际上很简单的,主要是想复习一下顺序栈和链栈的实现。
顺序栈实现
#include <bits/stdc++.h>
using namespace std;
typedef struct SqStack
{
char *base;
char top;
int stacksize;
} SqStack;
void InitStack(SqStack &S)
{
S.base = (char *)malloc(sizeof(S.stacksize));
S.top = -1;
}
bool push(SqStack &S, char item)
{
//栈满,入栈失败。这里可以设置扩容的操作realloc()
if (S.top == S.stacksize)
{
return false;
}
S.base[++S.top] = item;
return true;
}
char pop(SqStack &S)
{
if (S.top != -1)
{
// S.top--;
return S.base[S.top--];
}
}
bool block_match(SqStack &S, string str)
{
for (int i = 0; i < str.length(); i++)
{
if (str[i] == '(')
{
push(S, str[i]);
}
else
{
if (S.top == -1 || !pop(S) == '(')
{
return false;
}
}
}
//判断最后是否有括号剩余
if (S.top == -1)
return true;
else
return false;
}
int main()
{
string items;
while (cin >> items)
{
SqStack stack;
stack.stacksize = 100;
InitStack(stack);
if (block_match(stack, items))
{
printf("YES\n");
}
else
printf("NO\n");
}
}
链栈实现
#include <bits/stdc++.h>
using namespace std;
#define ElemType char
typedef struct SNode
{
ElemType data;
SNode *next;
} SNode, *LinkedStack;
void InitStack(LinkedStack &S)
{
S = (LinkedStack)malloc(sizeof(SNode));
S->next = nullptr;
}
void push(LinkedStack &S, ElemType item)
{
SNode *s;
s = (SNode *)malloc(sizeof(SNode));
//头插法
s->data = item;
s->next = S->next;
S->next = s;
}
void pop(LinkedStack &S)
{
SNode *s = S->next;
S->next = s->next;
free(s);
}
bool block_match(LinkedStack &S, string str)
{
for (int i = 0; i < str.length(); i++)
{
if (str[i] == '(')
push(S, str[i]);
else
{
if (S->next != nullptr)
{
pop(S);
}
else
return false;
}
}
if (S->next == nullptr)
return true;
else
return false;
}
int main()
{
string items;
while (cin >> items)
{
LinkedStack S;
InitStack(S);
if (block_match(S, items))
printf("YES\n");
else
printf("NO\n");
}
}