ACM练习 愚人节拆括号【vector的清空 栈的使用】

关于vector的清空

vectorname.clear();

vectorname.clear()函数并不会把所有元素清零,vector有两个参数,一个是size,表示当前vector容器内存储的元素个数,一个是capacity,表示当前vector在内存中申请的这片区域所能容纳的元素个数。

通常capacity会比size大,如果往vector中push_back数据,这样就不用重新申请内存和拷贝元素到新内存区域了,便于节省时间。

所以vector.clear()的真正作用是:把size设置成0,capacity不变

但是在本题中,使用vectorname.clear(),在每次循环开始的时候把vector设置为空容器,还是可以的。

C++ STL库中有专门的stack,在头文件中包含<stack>即可,下面代码贴出了两种方法,一种是直接使用stack,另一种是使用vector模拟出stack的效果。

描述

愚人节到了,祝大家节日快乐~作为源代码的主要领导人,DarkZero同学想了个愚弄大家的好办法——送礼物。嘿嘿,不要想的太好,哪儿能给你们那么轻易空手套白狼,DarkZero为了愚人,准备了很多套娃,其中有一个套娃里面装了礼物,这个套娃里也可能还有套娃,为的就是让你稍微不注意就没看到礼物。套娃里面可以再放若干个套娃,也可以不放,完全看他心情。用[]表示一个套娃,G表示礼物,DarkZero想让你帮他算出愚人指数,即运气最好的人需要打开多少个套娃就能拿到礼物。

输入
第一行包含一个整数T,代表测试样例数。
接下来每行代表一个测试样例,每行中有一个字符串,包含’[’,’]'和’G’三种字符。每行长度不超过200。

输出
对每个测试样例输出一行,一行中包含一个数字,代表最少需要打开的套娃数。

样例输入

2
[[G]]
[G][]

样例输出

2
1

提示
这道题目可以使用简单的动态规划来求解,或者使用搜索加剪枝的方法。测试样例有很多,写的不好可能会超时。

我的测试用例

输入:[[[[][[[[]]][[][[]][][][][][[[[]]]]]]][G]
答案:1

代码

方法1:vector

#include<iostream>
#include<string>
#include<vector>
using namespace std;

int main()
{
	int total;
	cin >> total;

	vector<char> stackStr;
	string str;

	int j;
	for (j = 0; j < total; j++)
	{
		cin >> str;

		int i;

		stackStr.clear();
		for (i = 0; i < str.length(); i++)
		{

			if (str[i] == 'G')
			{
				cout << stackStr.size() << endl;
			}
			else
			{
				if (stackStr.size() == 0)//栈为空
				{
					stackStr.push_back(str[i]);//入栈
				}
				else if (*(stackStr.end() - 1) == '['&&str[i] == ']')//匹配
				{
					stackStr.erase(stackStr.end() - 1);//出栈
				}
				else
				{
					stackStr.push_back(str[i]);//入栈
				}
			}
		}
	}
	system("pause");
}

方法2:stack

#include<iostream>
#include<string>
#include<stack>
using namespace std;

int main()
{
	int total;
	cin >> total;

	stack<char> stackStr;
	string str;

	int j;
	for (j = 0; j < total; j++)
	{
		cin >> str;

		int i;
		while (!stackStr.empty())
		{
			stackStr.pop();
		}

		for (i = 0; i < str.length(); i++)
		{
			if (str[i] == 'G')
			{
				cout << stackStr.size() << endl;
				break;
			}
			else
			{
				if (stackStr.size() == 0)//栈为空
				{
					stackStr.push(str[i]);//入栈
				}
				else if (stackStr.top() == '['&&str[i] == ']')//匹配
				{
					stackStr.pop();//出栈
				}
				else
				{
					stackStr.push(str[i]);//入栈
				}
			}
		}
	}

	cout << endl;
	system("pause");
}
//[][][[][[]][]][[]][][[[[[[[]]]][][]][[][[]][[[[G[]][]][]]][]]]][[][]][][[][]][][]
//答案:7

猜你喜欢

转载自blog.csdn.net/sinat_42483341/article/details/89221111