题目描述
输入样例 1:
5
40 5 8 3 2
/ * - +
输出样例 1:
2
输入样例 2:
5
2 5 8 4 4
* / - +
输出样例 2:
ERROR: 5/0
解题思路
最基本的利用栈的特性来解决的题目,如果看不懂的可以去先学一下栈的相关应用
C语言解法
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 1000
// 整数栈结构体
typedef struct {
int data[MAX_SIZE];
int top;
} IntStack;
// 字符栈结构体
typedef struct {
char data[MAX_SIZE];
int top;
} CharStack;
// 整数栈操作函数
void IntStack_Init(IntStack* stack) {
stack->top = -1;
}
void IntStack_Push(IntStack* stack, int value) {
if (stack->top < MAX_SIZE - 1) {
stack->data[++stack->top] = value;
}
}
int IntStack_Pop(IntStack* stack) {
if (stack->top == -1) {
return -1; // 表示栈空
}
return stack->data[stack->top--];
}
int IntStack_IsEmpty(const IntStack* stack) {
return stack->top == -1;
}
// 字符栈操作函数
void CharStack_Init(CharStack* stack) {
stack->top = -1;
}
void CharStack_Push(CharStack* stack, char value) {
if (stack->top < MAX_SIZE - 1) {
stack->data[++stack->top] = value;
}
}
char CharStack_Pop(CharStack* stack) {
if (stack->top == -1) {
return '\0'; // 表示栈空
}
return stack->data[stack->top--];
}
char CharStack_IsEmpty(const CharStack* stack) {
return stack->top == -1;
}
int main() {
IntStack numStack;
CharStack opStack;
IntStack_Init(&numStack);
CharStack_Init(&opStack);
int n, temp;
char op;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &temp);
IntStack_Push(&numStack, temp);
}
// 消耗一个换行符
char dummy;
scanf("%c", &dummy);
// 等效于getchar();
for (int i = 0; i < n - 1; i++) {
scanf(" %c", &op); // 注意在%c前有一个空格,用于消耗任何空白字符
//这里的scanf调用中的空格字符(" %c"中的空格)告诉scanf跳过任何空白字符(包括空格、制表符、换行符等),直到遇到第一个非空白字符。
//但是,因为在读取操作符之前已经消耗了换行符,所以scanf会立即读取下一个非空白字符,即第一个操作符 / 。
CharStack_Push(&opStack, op);
}
int res = 0;
while (!IntStack_IsEmpty(&numStack) && !CharStack_IsEmpty(&opStack)) {
int n1 = IntStack_Pop(&numStack);
int n2 = IntStack_Pop(&numStack);
op = CharStack_Pop(&opStack);
switch (op) {
case '/':
if (n1 == 0) {
printf("ERROR: %d/0\n", n2);
return 0;
}
else {
res = n2 / n1;
}
break;
case '+':
res = n2 + n1;
break;
case '-':
res = n2 - n1;
break;
case '*':
res = n2 * n1;
break;
}
IntStack_Push(&numStack, res);
}
printf("%d\n", IntStack_Pop(&numStack));
return 0;
}
C++解法
#include <bits/stdc++.h>
using namespace std;
stack<int>S1;
stack<char>S2;
int main()
{
int n;
cin >> n;
for(int i=0;i<n;i++)
{
int temp;
cin >> temp;
S1.push(temp);
}
cin.ignore();
for (int i = 0; i < n-1; i++)
{
char temp;
cin >> temp;
S2.push(temp);
}
int res = 0;
while (!S1.empty() && !S2.empty())
{
int n1 = S1.top(); S1.pop();
int n2 = S1.top(); S1.pop();
char op = S2.top(); S2.pop();
if (op == '/')
{
if (n1 == 0)
{
cout << "ERROR: " << n2 << "/0" << endl;
return 0;
}
else
{
res = n2 / n1;
S1.push(res);
}
}
else if (op == '+')
{
res = n2 + n1;
S1.push(res);
}
else if (op == '-')
{
res = n2 - n1;
S1.push(res);
}
else if (op == '*')
{
res = n2 * n1;
S1.push(res);
}
}
cout<<res<<endl;
return 0;
}