计算堆栈中的剩余数字
向一个空栈中依次存入正整数,假设入栈元素n(1<=n<=231-1)按顺序依次为nx、…、n4、n3、n2、n1,每当元素入栈时,如果n1=n2+…+ny(y的范围[2,x],1<=x<=1000),则n1…ny全部元素出栈,重新入栈新元素m(m=2 * n1)。
如:依次向栈存入6、1、2、3,当存入6、1、2时,栈底至栈顶依次为[6、1、2];当存入3时,3=2+1,3、2、1全部出栈,重新入栈元素6(6=2*3),此时栈中有元素6;因为6=6,所以两个6全部出栈,存入12,最终栈中只剩一个元素12。
代码一:
#include <iostream>
#include <vector>
using namespace std;
// 5 10 20 50 85 1
// 1 170
int main(void) {
vector<int> arr;
int num = 0;
while (scanf_s("%d", &num)) {
arr.push_back(num);
if (getchar() == '\n') {
break;
}
}
int size = arr.size();
int top = -1;
for (int i = 0; i < size; ++i) {
int sum = 0;
bool flag = false;
for (int k = top; k >= 0; --k) {
sum += arr[k];
if (sum == arr[i]) {
arr[i] <<= 1;
top = k;
sum = 0;
flag = true;
continue;
}
if (sum > arr[i]) {
break;
}
}
if (!flag) {
++top;
}
arr[top] = arr[i];
}
for (int i = top; i > 0; --i) {
cout << arr[i] << " ";
}
cout << arr[0];
return 0;
}
代码二:
#include <iostream>
#include <string>
#include <unordered_set>
#include <vector>
using namespace std;
vector<int> stack_remain(const vector<int>& arr) {
int sum = 0;
int preSum = 0;
vector<int> stk;
unordered_set<int> hset;
hset.insert(0);
for (int num : arr) {
preSum = sum - num;
while (hset.count(preSum)) {
num <<= 1;
if (preSum == 0) {
vector<int>().swap(stk);
unordered_set<int>().swap(hset);
sum = 0;
hset.insert(0);
break;
}
while (sum != preSum) {
hset.erase(sum);
sum -= stk.back();
stk.pop_back();
}
preSum = sum - num;
}
sum += num;
hset.insert(sum);
stk.push_back(num);
}
return stk;
}
void test(const string& test_name, const vector<int>& arr, const vector<int>& expected) {
cout << test_name << " begins:" << endl;
vector<int> res = stack_remain(arr);
if (res == expected) {
cout << "passed." << endl;
}
else {
cout << "failed." << endl;
}
cout << endl;
}
void test1() {
vector<int> arr = { 6, 1, 2, 3 };
test("test1", arr, { 12 });
}
void test2() {
vector<int> arr = { 5, 10, 20, 50, 85, 1 };
test("test2", arr, { 170, 1 });
}
void test3() {
vector<int> arr = { 1 };
test("test3", arr, { 1 });
}
void test4() {
vector<int> arr = { 1, 3, 5, 7 };
test("test4", arr, { 1, 3, 5, 7 });
}
int main(void) {
test1();
test2();
test3();
test4();
return 0;
}