Problem Description
給你一串字符,可能包括括號、數字、字母、標點符號、空格,你的任務是檢查這一串字符中的( ) ,[ ],{ }是否匹配。
Input
輸入數據有多組,處理到文件結束。
Output
如果匹配就輸出“yes”,不匹配輸出“no”
Sample Input
sin(20+10)
{[}]
Sample Output
yes
no
使用c++標準庫裏棧的解法:
//使用c++標準庫裏的棧
#include "iostream"
#include "string"
#include "stack"
using namespace std;
bool isbalance(string str)
{
int len = str.size();
stack<char> mystack;
for (int i = 0; i < len; i++)
{
if (str[i] == '[' || str[i] == '{' || str[i] == '(')
mystack.push(str[i]);
else if (str[i] == ']' || str[i] == '}' || str[i] == ')')
{
if (mystack.empty())
{
cout << "no" << endl;
return false;
}
if (str[i] == ']')
{
if ('[' != mystack.top()) return false;
mystack.pop();
}
else if (str[i] == '}')
{
if ('{' != mystack.top()) return false;
mystack.pop();
}
else if (str[i] == ')')
{
if ('(' != mystack.top()) return false;
mystack.pop();
}
}
}//結束for
if (mystack.empty())
return true;
else
{
mystack.pop();
return false;
}
}
int main()
{
bool bal;
string str;
while (cin >> str)
{
bal = isbalance(str);
if (bal == true) cout << "yes" << endl;
else cout << "no" << endl;
}
return 0;
}
不使用標準庫裏棧的解法:
//使用棧的思想,C語言模擬棧
#include <stdio.h>
#include <string.h>
struct stack
{
int data[500];
int top;
};
int main()
{
char s[1000];
int n , flag;//字符長度,標記量
struct stack st;
while (gets_s(s) != NULL)
{
n = strlen(s);
flag = 1;
st.top = -1;
for (int i = 0; i<n; i++)
{
if (s[i] == '(' || s[i] == '[' || s[i] == '{')
{
st.top++;
st.data[st.top] = s[i];
}
else if (s[i] == ')')
{
if (st.top != -1 && st.data[st.top] == '(')
{
st.top--;//注意實際沒有刪除棧頂的元素
}
else
{
printf("no\n");
flag = 0;
break;
}
}
else if (s[i] == ']')
{
if (st.top != -1 && st.data[st.top] == '[')
{
st.top--;
}
else
{
printf("no\n");
flag = 0;
break;
}
}
else if (s[i] == '}')
{
if (st.top != -1 && st.data[st.top] == '{')
{
st.top--;
}
else
{
printf("no\n");
flag = 0;
break;
}
}
}
if (flag == 1)
{
if (st.top == -1)
{
printf("yes\n");
}
else
{
printf("no\n");
}
}
}
return 0;
}