四小时白搞了啊,样例都能过,但是全错,不过原因都是read ASCII 13。
查看原帖
四小时白搞了啊,样例都能过,但是全错,不过原因都是read ASCII 13。
862525
BlackJac楼主2023/1/20 18:21

这道题从昨天写到半夜收获了全错的结果(只有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;
}
2023/1/20 18:21
加载中...