这道题从昨天写到半夜收获了全错的结果(只有subtask2过了),很不甘,自己试了所有的样例和自己创建的一些式子,看了都没问题。大早上起床调试还是没好,不是很想搞这题了,但是我怕就差一点点小细节就OK了,不想白白浪费我的4小时。
代码比较丑,栈是自己定义的可以不用看。如果有好心人能看看就好了
#include <iostream>
#include <cmath>
using namespace std;
struct CharStack
{
int max_size;
int length = 0;
char* array = new char[max_size];
};
CharStack* stack1_create(int max_size)
{
CharStack* a = new CharStack{ max_size };
return a;
}
void push(CharStack* a, char value)
{
if (a->length >= a->max_size) cout << "栈满,无法使用push操作" << endl;
else
{
a->array[a->length] = value;
a->length += 1;
}
}
char pop(CharStack* a)
{
if (a->length <= 0) cout << "栈空,无法使用pop操作" << endl;
else a->length -= 1;
return a->array[a->length];
}
bool isFull(CharStack* a)
{
if (a->length == a->max_size) return true;
else return false;
}
bool isEmpty(CharStack* a)
{
if (a->length == 0) return true;
else return false;
}
typedef struct stack
{
int max_size;
int length = 0;
int* array = new int[max_size];
} Stack;
stack* stack_create(int max_size)
{
Stack* a = new Stack{ max_size };
return a;
}
void push(stack* a, int value)
{
if (a->length >= a->max_size) cout << "栈满,无法使用push操作" << endl;
else
{
a->array[a->length] = value;
a->length += 1;
}
}
int pop(stack* a)
{
if (a->length <= 0) cout << "栈空,无法使用pop操作" << endl;
else a->length -= 1;
return a->array[a->length];
}
int check(char s)
{
switch (s)
{
case '+':return 1;
case '-':return 1;
case '(':return 0;
case '*':return 2;
case '/':return 2;
case '^':return 3;
case ')':return 0;
default: return -1;
}
}
void printout(Stack* num)
{
for (int i = 0; i < num->length; i++) cout << num->array[i] << ' ';
}
int main()
{
char* input = new char[200];
CharStack* back = stack1_create(100);
CharStack* op = stack1_create(100);
Stack* num = stack_create(100);
int length_input = 0;
input[length_input] = getchar();
while (input[length_input] != '\n') //读取字符串
{
length_input++;
input[length_input] = getchar();
}
for (int i = 0; i < length_input; i++)
{
if (check(input[i]) == -1) push(back, input[i]);//数字时直接入back栈
else if (input[i] == '(') push(op, '('); //左括号直接入栈
else if (input[i] == ')') //右括号一直出栈直到左括号
{
while (op->array[op->length - 1] != '(') push(back, pop(op));
pop(op);
}
else if (check(input[i]) == 3) push(op, input[i]);
else if (isEmpty(op)) push(op, input[i]); //操作符栈空时遇到操作符入op栈
else if (1 - isEmpty(op) && check(input[i]) > check(op->array[op->length - 1])) push(op, input[i]); //op栈不为空,新运算符数比栈顶数高,入op栈
else if (check(input[i]) <= check(op->array[op->length - 1])) //相等和小于的操作数时,一直出下面的数,直到比他大。
{
while (check(input[i]) <= check(op->array[op->length - 1]) && 1 - isEmpty(op)) push(back, pop(op));
push(op, input[i]); //然后入新操作数
}
}
while (op->length) push(back, pop(op)); //将操作数栈内剩余都出栈
int i, x, y; //现在我们拥有一个后缀表达式字符栈
for (int i = 0; i < back->length; i++) cout<<back->array[i]<<' ';
cout << '\n'; //直接输出一次后缀表达式,完成第一行,同时之前的num栈可以开始读取数据了
for (i = 0; i < back->length; i++)
{
char c = back->array[i];
if (c >= 48 && c <= 57) push(num, c - 48);
else
{
x = pop(num);
y = pop(num);
switch (c)
{
case '+':push(num, x + y); break;
case '-':push(num, y - x); break;
case'*':push(num, x * y); break;
case '/':push(num, y / x); break;
case '^':push(num, pow(y, x)); break;
}
printout(num);
for (int j = i + 1; j < back->length; j++) cout << back->array[j] << ' ';
if (i!=back->length-1)cout << endl;
}
}
return 0;
}