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

题目:括号配对问题

现在,有一行括号序列,请你检查这行括号是否配对。 输入第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[", “]”, “(”, “)” 四种字符。

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

本题的主要代码为:

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

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

//cout << “输出字符串的长度”<<strlen(a) << endl;
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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值