1.实现一个栈,支持入栈,出栈,查询栈中最小值的功能,时间复杂度要求为常数
用数组模拟栈操作
查询最小值的话可以另外使用一个数组记录当前下标的最小值
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5;
struct Queue {
int q[maxn];
int q_min[maxn];
int index = 0;
void init() {
q_min[0] = 0x3f3f3f3f;
index = 0;
}
void push(int x) {
q[++index] = x;
q_min[index] = min(x, q_min[index - 1]);
}
void pop() {
index--;
}
int getmin() {
return q_min[index];
}
};
int main() {
;
}
2.使用两个栈解决问题
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4699
题目数据量是1e6
可以使用一个栈表示光标前,一个栈表示光标后,然后维护光标前的最小前缀和即可
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 7;
int q1[maxn], q2[maxn];
int sum1[maxn], max_sum1[maxn]; //sum1 为光标前前缀和 max_sum1为维护最小光标前前缀和
int ind1, ind2;
void insert(int x) {
q1[++ind1] = x;
sum1[ind1] = sum1[ind1 - 1] + x;
max_sum1[ind1] = max(max_sum1[ind1 - 1], sum1[ind1]);
}
void del() {
ind1--;
}
void lef() {
if (ind1) {
q2[++ind2] = q1[ind1--];
}
}
void rig() {
if (ind2) {
q1[++ind1] = q2[ind2--];
sum1[ind1] = sum1[ind1 - 1] + q1[ind1];
max_sum1[ind1] = max(max_sum1[ind1 - 1], sum1[ind1]);
}
}
int query(int x) {
return max_sum1[x];
}
int main() {
int n;
while (cin >> n) {
max_sum1[0] = -0x3f3f3f3f;
memset(sum1, 0, sizeof(sum1));
sum1[1] = 0; //细节一号
ind1 = ind2 = 0;
while (n--) {
char s[5];
int inp;
scanf("%s", s);
if (s[0] == 'I') {
scanf("%d", &inp);
insert(inp);
}
else if (s[0] == 'D') del();
else if (s[0] == 'L') lef();
else if (s[0] == 'R') rig();
else {
scanf("%d", &inp);
printf("%d\n", query(inp));
}
}
}
return 0;
}