题目传送门
思路:
题目要求我们维护一个序列,并根据给定的操作进行添加和删除元素,最后计算序列中所有数的和。我们可以使用栈来实现这个功能,因为栈的特性非常适合处理这种在序列末尾添加和删除元素的操作。
栈:
栈(Stack)是一种线性数据结构,遵循后进先出(Last In, First Out,LIFO)的原则。栈的基本操作包括:
- push:将元素压入栈顶。
- pop:从栈顶移除元素。
- top(或 peek):查看栈顶元素,但不移除它。
- empty:检查栈是否为空。
栈在计算机科学中有广泛的应用,例如函数调用栈、表达式求值、括号匹配检查等。
具体步骤:
- 初始化栈:创建一个栈来存储序列中的元素。
- 读取操作次数:读取整数
k,表示操作的次数。 - 执行操作:
- 循环读取
k次操作:- 如果读取到的数
a为0,则表示删除最后一个加入的数,调用stack.pop()。 - 如果
a不为0,则将a加入序列,调用stack.push(a)。
- 如果读取到的数
- 循环读取
- 计算最终序列的和:
- 使用一个变量
sum来累加栈中的元素。 - 遍历栈中的元素,累加到
sum变量中,同时每次循环都调用stack.pop()来移除栈顶元素。
- 使用一个变量
- 输出结果:输出最终序列的和
sum。
代码&解释:
c++代码:
#include <iostream>
#include <stack>
using namespace std;
int main() {
int k;
cin >> k;
stack<int> sequence;
for (int i = 0; i < k; ++i) {
int a;
cin >> a;
if (a == 0) {
sequence.pop();
} else {
sequence.push(a);
}
}
int sum = 0;
while (!sequence.empty()) {
sum += sequence.top();
sequence.pop();
}
cout << sum << endl;
return 0;
}
代码解释:
-
包含头文件:
#include <iostream>:用于输入输出操作。#include <stack>:用于使用STL中的栈。
-
使用命名空间:
using namespace std;:使得我们可以直接使用标准库中的名称,而不需要每次都加上std::前缀。
-
主函数:
int main() {:程序从这里开始执行。
-
读取操作次数:
int k;:声明一个整数变量k。cin >> k;:读取一个整数k,表示接下来要进行的操作次数。
-
初始化栈:
stack<int> sequence;:创建一个stack<int>类型的栈sequence,用于存储序列中的元素。
-
执行操作:
for (int i = 0; i < k; ++i) {:使用for循环读取k次操作。int a;:声明一个整数变量a。cin >> a;:读取一个整数a。if (a == 0) {:如果a为0,调用sequence.pop()删除栈顶元素。} else {:如果a不为0,调用sequence.push(a)将a压入栈顶。}:结束if-else语句。}:结束for循环。
-
计算最终序列的和:
int sum = 0;:声明一个整数变量sum并初始化为0。while (!sequence.empty()) {:使用while循环遍历栈中的元素,直到栈为空。sum += sequence.top();:将栈顶元素加到sum中。sequence.pop();:移除栈顶元素。}:结束while循环。
-
输出结果:
cout << sum << endl;:输出最终序列的和sum。
-
返回值:
return 0;:程序正常结束,返回0。
如果诸位大佬没有学过栈,你可以用动态数组模拟栈:
#include <iostream>
using namespace std;
int main(){
int k;
cin>>k;
int* sequence = new int[k];
int top = -1;
for (int i = 0;i < k;++i){
int a;
cin>>a;
if(a == 0) {--top;}
else{sequence[++top] = a;}
}
int sum = 0;
for (int i = 0;i <= top;++i){sum += sequence[i];}
cout<<sum<<endl;
return 0;
}
代码解释:
-
输入部分:
- 首先读取整数
k,表示操作的次数。 - 创建一个动态数组
sequence来模拟栈,大小为k。 - 使用
top变量来跟踪栈顶的位置,初始值为-1表示栈为空。
- 首先读取整数
-
操作部分:
- 循环读取
k次操作:- 如果读取到的数
a为0,则表示删除最后一个加入的数,即将top减1。 - 如果
a不为0,则将a加入序列,即将a赋值给sequence[++top]。
- 如果读取到的数
- 循环读取
-
计算最终序列的和:
- 遍历从
0到top的元素,累加到sum变量中。
- 遍历从
-
输出结果:
- 输出最终序列的和
sum。
- 输出最终序列的和
-
释放动态数组:
- 使用
delete[]释放动态分配的数组sequence。
- 使用
Python代码:
def main():
k = int(input())
sequence = []
for _ in range(k):
a = int(input())
if a == 0:
sequence.pop()
else:
sequence.append(a)
sum_result = sum(sequence)
print(sum_result)
if __name__ == "__main__":
main()
代码解释:
-
读取操作次数:
k = int(input()):读取一个整数k,表示接下来要进行的操作次数。
-
初始化列表:
sequence = []:创建一个空列表sequence,用于存储序列中的元素。
-
执行操作:
for _ in range(k)::使用for循环读取k次操作。a = int(input()):读取一个整数a。if a == 0::如果a为0,调用sequence.pop()删除列表最后一个元素。else::如果a不为0,调用sequence.append(a)将a添加到列表末尾。
-
计算最终序列的和:
sum_result = sum(sequence):计算列表中所有元素的和。
-
输出结果:
print(sum_result):输出最终序列的和sum_result。
Pascal代码(现打的,没试过,仅供参考):
program ZeroThatOut;
uses sysutils;
var
k, a, i, sum, top: integer;
sequence: array of integer;
begin
readln(k);
setlength(sequence, k);
top := -1;
for i := 0 to k - 1 do
begin
readln(a);
if a = 0 then
begin
if top >= 0 then
begin
dec(top);
end;
end
else
begin
inc(top);
sequence[top] := a;
end;
end;
sum := 0;
for i := 0 to top do
begin
sum := sum + sequence[i];
end;
writeln(sum);
end.
代码解释:
-
读取操作次数:
readln(k);:读取一个整数k,表示接下来要进行的操作次数。
-
初始化动态数组:
setlength(sequence, k);:创建一个动态数组sequence,初始大小为k。top := -1;:初始化top为-1,表示栈为空。
-
执行操作:
for i := 0 to k - 1 do:使用for循环读取k次操作。readln(a);:读取一个整数a。if a = 0 then:如果a为0,并且栈不为空(top >= 0),则调用dec(top)删除栈顶元素。else:如果a不为0,调用inc(top)增加栈顶指针,并将a添加到栈顶位置sequence[top]。
-
计算最终序列的和:
sum := 0;:初始化sum为0。for i := 0 to top do:遍历栈中的所有元素。sum := sum + sequence[i];:将栈中的元素加到sum中。
-
输出结果:
writeln(sum);:输出最终序列的和sum。
158

被折叠的 条评论
为什么被折叠?



