知识点
栈
- 规则:后入先出(Last In First Out)
- 基本操作:
- push(x):在栈顶部添加元素x
- pop():在栈顶部取出元素
- isEmpty():检查栈是否为空
- isFull():检查栈是否已满
- STL中的stack类的成员函数,都是O(1)操作
- size():返回栈的元素数
- top():返回栈顶的元素
- pop():从栈中取出并删除元素
- push(x):向栈中添加元素x
- empty(): 在栈为空时返回true
题目链接
题目内容
输出逆波兰表示法的算式的结果
思路
利用栈的结构特点去实现算法。若遇到数字,则将其压入栈;若是运算符,则取出栈顶部的两个元素进行计算,然后将结果压入到栈顶继续执行算式,直到算出结果
代码
实现栈的功能
#include<iostream>
#include<cstdio>
using namespace std;
// 实现栈的功能
// top是指向栈顶的指针, s是实现栈结构的数组
int top, S[1000];
// 将x压入栈的操作
void push(int x) {
// top加1之后将元素插入到top所指的位置
S[++top] = x;
}
// 将栈顶元素返回并删除
int pop() {
top--;
return S[top + 1];
}
// 字符转数字
int CharToInt(char s[]) {
int ans = 0, i = 0;
while (s[i] != '\0') {
ans = ans * 10 + s[i] - '0';
i++;
}
return ans;
}
int main() {
char s[1000];
int a, b;
// 清空栈
top = 0;
while(scanf("%s",s)!=EOF){
if (s[0] == '+') {
b = pop();a = pop();
push(a + b);
}else if (s[0] == '-') {
b = pop(); a = pop();
push(a - b);
}else if (s[0] == '*') {
b = pop(); a = pop();
push(a * b);
}else {
push(CharToInt(s));
}
}
printf("%d\n",pop());
return 0;
}
利用STL的stack类
#include<iostream>
#include<cstdio>
#include<stack>
using namespace std;
// 字符转数字
int CharToInt(char s[]) {
int ans = 0, i = 0;
while (s[i] != '\0') {
ans = ans * 10 + s[i] - '0';
i++;
}
return ans;
}
int main() {
char s[1000];
int a, b;
stack<int> S;
while(scanf("%s",s)!=EOF){
if (s[0] == '+') {
b = S.top(); S.pop();
a = S.top(); S.pop();
S.push(a + b);
}else if (s[0] == '-') {
b = S.top(); S.pop();
a = S.top(); S.pop();
S.push(a - b);
}else if (s[0] == '*') {
b = S.top(); S.pop();
a = S.top(); S.pop();
S.push(a * b);
}else {
S.push(CharToInt(s));
}
}
printf("%d\n", S.top());
return 0;
}