把题目给出中缀表达式转换为后缀表达式输出,并求后缀表达式的值。为简单起见,我们约定:1、输入的中缀表达式一定是合法的,并且只含数字,四种运算符+、-、*、/和小括号;2、运算数都是一位正整数(1~9);3、输入的中缀表达式不超过20个字符;4、除法运算的结果仍然是正整数。
输入格式:
输入的第一行是一个正整数 N ,表示以下有 N 行。每行是一个中缀表达式。为简单起见,我们约定:1、输入的中缀表达式一定是合法的,并且只含数字,四种运算符+、-、*、/和小括号;2、运算数都是一位正整数(1~9);3、输入的中缀表达式不超过20个字符;4、除法运算的结果仍然是正整数。
输出格式:
输出每行中缀表达式所对应后缀表达式,隔一个空格之后,输出该后缀表达式计算之后得到的值。
样例">输入样例:
在这里给出一组输入。例如:
6
2+4
3+2*7
2*(4+6)
(5/2+4)*5+2
(3+5)*(7-2)/4
5*(8-(3+2))
输出样例:
在这里给出相应的输出。例如:
24+ 6
327*+ 17
246+* 20
52/4+5*2+ 32
35+72-*4/ 10
5832+-* 15
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#define Maxsize 100
typedef struct Stack {
char data[Maxsize];
int top;
}SqStack;
typedef struct StackNum {
int data[Maxsize];
int top;
}NuStack;
//字符栈
int ChStackEmpty(SqStack* P) {
return P->top == -1;
}
int ChStackFull(SqStack* P) {
return P->top == Maxsize - 1;
}
void ChenStzck(SqStack* P, char c) {
if (ChStackFull(P))return;
P->top++;
P->data[P->top] = c;
return;
}
void ChoutStack(SqStack* P) {
if (ChStackEmpty(P))return;
P->top--;
return;
}
void ChoutStack(SqStack* P, char& e) {
if (ChStackEmpty(P))return;
e = P->data[P->top];
P->top--;
return;
}
//数字栈的方法
int StackEmpty(NuStack* P) {
return P->top == -1;
}
int StackFull(NuStack* P) {
return P->top == Maxsize - 1;
}
void enStzck(NuStack* P, int c) {
if (StackFull(P))return;
P->top++;
P->data[P->top] = c;
return;
}
void outStack(NuStack* P) {
if (StackEmpty(P))return;
P->top--;
return;
}
void outStack(NuStack* P, int& e) {
if (StackEmpty(P))return;
e = P->data[P->top];
P->top--;
return;
}
void fori(SqStack* P) {
int i = 0;
while (i != P->top+1) {
printf("%c", P->data[i++]);
}
return;
}
int main() {
//转后缀表达式
//接受表达式的数量
int n;
scanf_s("%d", &n);
getchar();
for (int i = 0; i < n; i++)
{
//初始化栈
SqStack* p = (SqStack*)malloc(sizeof(SqStack));
p->top = -1;
//接受原始表达式
char arr[30];
gets_s(arr);
//定义一个数组用于接受后缀表达式
char suffix[21] = {' '};
int flag = 0;
for (int j = 0; arr[j] != '\0'; j++) {
//printf("%c\n", arr[j]);
if (arr[j] >= '0' && arr[j] <= '9')
{ suffix[flag++] = arr[j]; }
else if(arr[j]=='+'||arr[j]=='-')
{
//将栈中的符号全弹出
while (p->top != -1 && p->data[p->top] != '(') {
ChoutStack(p,suffix[flag++]);
}
//在将正负号压入栈
ChenStzck(p, arr[j]);
}
else if(arr[j] == '(')
{
ChenStzck(p, arr[j]);
//continue;
}
else if (arr[j] == '*' || arr[j] == '/')
{
while (p->top != -1 && p->data[p->top] != '(') {
if(p->data[p->top] == '*'|| p->data[p->top]=='/')ChoutStack(p, suffix[flag++]);
else
{
break;
}
}
ChenStzck(p, arr[j]);
}
else if(arr[j] == ')')
{
//将左括号前的符号弹出
while (p->top!=-1&&p->data[p->top] != '(') {
ChoutStack(p, suffix[flag++]);
}
//弹出左括号
ChoutStack(p);
}
}
//最后将剩下的符号弹出
while (p->top != -1) {
ChoutStack(p,suffix[flag++]);
//printf("运行");
}
suffix[flag]='\0';
printf("%s", suffix);
//计算
NuStack* q = (NuStack*)malloc(sizeof(NuStack));
q->top = -1;
for (int j = 0; j < strlen(suffix); j++) {
if(suffix[j]>='0'&& suffix[j]<='9')
{
int e = suffix[j] - '0';
enStzck(q, e);
}
else if(suffix[j] == '+')
{
int e;
outStack(q,e);
q->data[q->top] += e;
}
else if (suffix[j] == '*')
{
int e;
outStack(q,e);
q->data[q->top] *= e;
}
else if (suffix[j] == '-')
{
int e;
outStack(q,e);
q->data[q->top] -= e;
}
else if (suffix[j] == '/')
{
int e;
outStack(q, e);
q->data[q->top] /= e;
}
}
printf(" %d\n", q->data[q->top]);
}
}