25.2.3 【洛谷】作为栈的复习不错(学习记录)
今天学习的东西不算多,放了一个星期假,感觉不少东西都没那么清楚,得复习一下才行。今天搞个栈题写,把栈复习一下,明天进入正轨,边复习边学习新东西,应该会有二叉树的学习等等...
【洛谷】P1449 后缀表达
今天主要是复习,所以就概括一下栈使用的重点。
目前学习的都是用数组模拟栈,c++中直接使用stack还不明白。
模拟栈的创建重点有二:
1. 数组(栈)
2.一个变量(栈指针)
模拟栈的基本使用:
1. 入栈
2. 出栈
(出入栈的操作靠栈指针完成)
这道题要想到用栈去解决。
基本思路:在遇到 ‘ . ’时,将前面的数字入栈,遇到运算符的时候,将栈顶的两个数字进行运算,再将运行结果放到栈中。
输入------>入栈-------->遇到运算符,栈顶两个数出栈计算------->结果入栈
注意:我一开始使用scanf直接输入字符串,然后用getchar去获取每个字符,导致运行超时。
之后使用了fgets(这个记得要学一下) 和 char数组,利用for循环对输入的数组进行遍历,效果比第一个好。
这题是比较简单的栈应用,很好的复习一遍栈的基本使用。
代码留下更清楚:
#include <stdio.h>
#include <string.h>
int main() {
char s[10000];
fgets(s, sizeof(s), stdin);
long long stack[1000];
long long ok = 0;
long long i = -1;
// 遍历每个字符直到遇到 '@'
for (int j = 0; s[j] != '@'; j++) {
char input = s[j];
if (input >= '0' && input <= '9') {
// 处理数字字符
ok = ok * 10 + (input - '0');
} else if (input == '.') {
// 入栈当前数值
stack[++i] = ok;
ok = 0; // 重置 ok 为 0
} else if (input == '+') {
stack[i - 1] = stack[i - 1] + stack[i];
i--; // 减小栈顶指针
} else if (input == '-') {
stack[i - 1] = stack[i - 1] - stack[i];
i--;
} else if (input == '*') {
stack[i - 1] = stack[i - 1] * stack[i];
i--;
} else if (input == '/') {
// 向零取整的除法
stack[i - 1] = (stack[i - 1] / stack[i]);
i--;
}
}
// 打印栈顶元素,即计算结果
printf("%lld\n", stack[0]);
return 0;
}