编程练习2:字符串匹配问题

题目:括号配对问题

现在,有一行括号序列,请你检查这行括号是否配对。 输入第一行输入一个数N(0

思路:
(1) 利用栈来完成这个操作,在C++中有已经封存好的栈,引用的方式为:
引入一个头文件:#include
申请一个栈:std::stack<类型> z;
栈的相关操作有:(此处指可以直接调用的函数名称)
empty():栈是否为空的函数,若栈为空则返回一个true
pop():删除栈顶元素
top():得到栈顶元素
push();压栈
size():返回栈中元素的数量
(2)字符串匹配的思路:
遇到左括号压栈,右括号弹栈,判断弹栈的元素是否与现有的进行匹配,若匹配则删除栈顶元素,不匹配证明现有已经输入的是不匹配的。
最终,在完成对所有的输入进行处理的时候,判断栈是否为空,若栈为空则证明所有的元素都已经弹栈完毕,若不为空说明输入的为奇数,不可能进行完整的匹配。
(3)字符串的处理方式:
在C++中,对字符串进行输入的一种方式,利用char型数组完成功能。
char a[100];
cin>>a;
这样的字符串输入以空格为终止符

本题的主要代码为:

本代码需要注意一个地方,子函数必须写在main函数的前面,否则在进行编译的时候,main函数找不到子函数会发生报错

#include
#include //使用现有库里的封装栈
using namespace std;
bool panduan(char a[])
{
//cout << “进入判断函数” << endl;
std::stack z;//申请一个栈进行判断

//cout << “输出字符串的长度”< for (int i = 0; i < strlen(a); i++) //小于字符串的长度
{
switch (a[i])
{
case ‘(’:
//cout << “判断为(” << endl;
z.push(a[i]); break;
case ‘[’:
//cout << “判断为[” << endl;
z.push(a[i]); break;
case ‘)’:
if (z.top() != ‘(’)//不匹配
return false;
else //匹配,弹栈
{
z.pop(); break;
}
case’]’:
if (z.top() != ‘[’)
return false;
else
{
z.pop();
// cout << “移除” << endl; break;
}
default:
break;
}
}
if ( !z.empty())
{
// cout << “栈不为空” << endl;
}
return z.empty();//若经过弹栈以后占为空,则证明已经完全匹配没有剩余
}
int main(void)
{
int n;//输入n,表示组数
cin >> n;
bool b[5];
for (int j = 0; j < 5; j++) //用于存放结果
{
b[j] = false;
} for (int i = 0; i < n; i++)
{
char a[1000];
cin >> a;
b[i] = panduan(a);
} for (int k = 0; k < n; k++)
{
if (b[k])
cout << “YES” << endl;
else
cout << “NO” << endl;
}
//system(“PAUSE”);
return 0;
}

你可能感兴趣的:(编程练习)