①
输入输出样例
输入
13 0 1 0 2 2 0 4 0 2 2 1 2 1 1 2 1 2
输出
2 4 4 1 0
思路:建两个栈,一个主栈用以存放数据,一个辅助栈存放最大值。
当操作'0'存入主栈的数据,比辅助栈顶数据大,或辅助栈为空栈时,同时向辅助栈存入这个数据。
如果主栈pop出的是最大值,同时辅助栈也要pop。
要注意的是需要判断两个栈是否为空,不为空再进行pop和读数操作。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
stack<int> mains, fs;//主栈和辅助栈
cin >> n;//操作总数
char op;//操作序号
for (int i = 0; i < n; i++)
{
cin >> op;
int m;
if (op == '0')
{
cin >> m;
mains.push(m);
if (fs.empty() || fs.top() < m)
fs.push(m);
}
else if (op == '1')
{
if (!mains.empty())
{
if (!fs.empty() && mains.top() == fs.top())
fs.pop();
mains.pop();
}
}
else if (op == '2')
{
if (!fs.empty())
cout << fs.top() << endl;//输出辅助栈栈顶元素即为最大值
else cout << "0" << endl;
}
}
}
②
输入输出样例
输入1
00
输出1
A
输入2
01001011
输出2
CCCABACCBAB
思路:递归,题中已给出递归式T(s) = ...,写一个递归函数T(s),把三种不同情况列出来。
#include <bits/stdc++.h>
using namespace std;
string T(string ts);
int main()
{
string s;
cin >> s;
cout << T(s);
}
string T(string ts)
{
int sum = 0;
for (int i = 0; i < ts.length(); i++)
sum = sum + ts[i] - '0';
if (sum == 0)
return "A";
else if (sum == ts.length())
return "B";
else {
string s1, s2 = "";
int mid = (ts.length() + 1) / 2;//字符串长度的一半
for (int i = 0; i < mid; i++)//前半段
s1 = s1 + ts[i];
for (int j = mid; j < ts.length(); j++)//后半段
s2 = s2 + ts[j];
return "C" + T(s1) + T(s2);
}
}