永发信息网

中缀表达式3 + 4/(25 -(6+15))* 8转换为后缀表达式

答案:3  悬赏:70  手机版
解决时间 2021-03-18 07:33
  • 提问者网友:我的未来我做主
  • 2021-03-17 20:48
中缀表达式3 + 4/(25 -(6+15))* 8转换为后缀表达式
最佳答案
  • 五星知识达人网友:雪起风沙痕
  • 2021-03-17 20:58
该问题的求解可以分为两部分:
1、中缀表达式到后缀表达式的转换;
2、后缀表达式的计算;

具体代码如下:

#include
#define StackSize 100
#define QueueSize 100

typedef char DataType;
typedef struct{
char data[100];
int front, rear;
}SeqQueue; // 定义队列类型

void InitQueue(SeqQueue *Q) // 初始化队列
{
Q->front = 0;
Q->rear = 0;
}

int QueueEmpty(SeqQueue *Q) // 判空队列
{
return Q->rear == Q->front;
}

void EnQueue(SeqQueue *Q, DataType x) // 入队列
{
if ((Q->rear + 1) % QueueSize == Q->front)
{
cout << "Queue overflow" << endl;
}
else
{
Q->data[Q->rear] = x;
Q->rear = (Q->rear + 1) % QueueSize;
}
}

DataType DeQueue(SeqQueue *Q) // 出队列
{
if (Q->rear == Q->front)
{
cout << "Queue empty" << endl;
}
else
{
DataType temp = Q->data[Q->front];
Q->front = (Q->front + 1) % QueueSize;
return temp;
}
}


typedef struct{
DataType data[100];
int top;
}SeqStack; //栈类型的定义

void InitStack(SeqStack *S) //初始化栈
{
S->top = 1;
}

void Push(SeqStack * S, DataType d) // 入栈
{
if(S->top == StackSize - 1)
{
cout << "stack overflow" << endl;
}
else
{
S->top = S->top + 1;
S->data[S->top] = d;
}
}

DataType Pop(SeqStack * S) // 出栈
{
if (S->top == -1)
{
cout << "stack underflow" << endl;
}
else
return S->data[S->top--];
}

DataType GetTop(SeqStack *S) // 取栈顶元素
{
if (S->top == -1)
{
cout << "stack empty" << endl;
}
else
{
return S->data[S->top];
}
}

//求运算符优先级
int Priority(DataType op)
{
switch (op)
{
case '(':
case '#': return (0);
case '-':
case '+': return (1);
case '*':
case '/': return (2);
}
}

void CTPostExp(SeqQueue *Q)
{
SeqStack OS; // 运算符栈
char c,t;
SeqStack *S;
S = &OS;
InitStack(S);
Push(S,'#'); // 压入栈底元素'#'
do // 扫描表达式
{
c = getchar();
switch (c)
{
case ' ':
break; // 去除空格
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
EnQueue(Q, c); break;
case '(': Push(S, c); break;
case ')':
case '#':
do {
t = Pop(S);
if(t != '(' && t != '#')
EnQueue(Q, t);
}while (t != '(' && S->top != 1);
break;
case '+':
case '-':
case '*':
case '/':
while(Priority(c) <= Priority(GetTop(S)))
{
t = Pop(S);
EnQueue(Q, t);
}
Push(S, c);
break;

}
}while(c != '#'); // 以'#'号结束表达式扫描
}

// 计算后缀表达式
int CPostExp(SeqQueue *Q)
{
SeqStack VS, *S;
char ch;
int x,y;
S = &VS;
InitStack(S);
while(!QueueEmpty(Q))
{
ch = DeQueue(Q);
if(ch >= '0' && ch <= '9')
{
Push(S, ch - '0');
}
else
{
y = Pop(S);
x = Pop(S);
switch (ch)
{
case '+' : Push(S, x + y); break;
case '-' : Push(S, x - y); break;
case '*' : Push(S, x * y); break;
case '/' : Push(S, x / y); break;
}
}
}
return GetTop(S);
}

int main()
{
SeqQueue *Q;
SeqQueue PostQ; //定义队列,存放后缀表达式
Q = &PostQ;
InitQueue(Q); //初始化队列
cout << "请输入数学表达式(以'#'结束):\n";
CTPostExp(Q);
// 计算后缀表达式
cout << "该表达式的值为: " << CPostExp(Q) << endl;
return 0;
}
全部回答
  • 1楼网友:千夜
  • 2021-03-17 22:36
3 4 25 6 15 + - 8 * / +
  • 2楼网友:野味小生
  • 2021-03-17 22:08
我写的计算器,用的中缀变后缀,可以进行+ - * / ^浮点运算 具有很强容错能力 #define maxsize 32 #define error(); printf("Expression error!");return 0; typedef float eletype; typedef struct{ eletype data[maxsize]; int top; }stack; stack StackO,StackN; void Initstack(stack *); eletype Push(stack *,eletype); eletype Pop(stack *); eletype Empty(stack *); eletype Full(stack *); eletype Gettop(stack *); char In(char); char Proceed(char ,char); eletype Operate(eletype ,char,eletype); eletype atof(char *); eletype cheng(eletype,eletype); eletype Evalexpres(stack *); eletype panduan(char ); void Initstack(stack *sp){ sp->top=-1; } eletype Push(stack *sp,eletype data){ if(Full(sp))return 0; sp->top++; sp->data[sp->top]=data; return 1; } eletype Pop(stack *sp){ if(Empty(sp))return 0; return sp->data[sp->top--]; } eletype Empty(stack *sp){ return sp->top==-1; } eletype Full(stack *sp){ return sp->top+1==maxsize; } eletype Gettop(stack *sp){ if(Empty(sp))return 0; return sp->data[sp->top]; } char In(char c){ char *str="+-*/^()="; int i; for(i=0;i<8;i++) if(str[i]==c) return 1; return 0; } char Proceed(char a,char b){ char str[8][8]={">><<<<>>",">><<<<>>",">>>><<>>",">>>><<>>", ">>>>><>>","<<<<<<= ",">>>>> >>","<<<<<< ="}; char str1[8]="+-*/^()="; int i; for(i=0;i<8;i++) { if(str1[i]==a)a=i;if(str1[i]==b)b=i; } return str[a][b]; } eletype Operate(eletype a,char r,eletype b){ eletype sum; switch(r){ case '+': sum=a+b;break; case '-': sum=b-a;break; case '*': sum=a*b;break; case '/': sum=b/a;break; case '^': sum=cheng(a,b);break; } return sum; } eletype atof(char *c){ eletype f; sscanf(c,"%f",&f); return f; } eletype cheng(eletype a,eletype b){ eletype sum=b; while(a-1){ sum*=b;a--; } return sum; } eletype panduan(char c){ int a,b; char *s="+-*/^()=0123456789."; for(a=0;s[a];a++) if(c==s[a])return 1; return 0; } eletype Evalexpres(stack *sp){ int l,ll,x,y,m,n,i=0,j=0; eletype a,b; char c[80],str[15]={0},r; Initstack(&StackO); Push(&StackO,'='); Initstack(&StackN); gets(c); l=strlen(c); c[l]='='; l++; for(x=0;x=2){error();}} Push(&StackN,atof(str)); printf("%f",atof(str)); for(m=0;m<15;str[m]=0,m++); j=0; } else { if(!panduan(c[i])){error();} switch(Proceed(Gettop(&StackO),c[i])) { case '<': Push(&StackO,c[i]);i++;break; case '=': Pop(&StackO);i++;break; case '>': r=Pop(&StackO); if(sp->top==-1){error();} a=Pop(&StackN); if(sp->top==-1){error();} b=Pop(&StackN); Push(&StackN,Operate(a,r,b)); break; case ' ': error(); default : error(); } } } if(sp->top==-1){error();} printf("=%f",Gettop(&StackN)); return 0; } int main() { char ch; while(1) { printf("Mini Calc version 1.0 Copyright (c) 2011 Student\n>"); Evalexpres(&StackN); printf("\ninput 'q' to quit and 'enter' to start!"); do{ scanf("%c",&ch); if(ch=='q'||ch=='Q')return 0; }while(ch!='\n'); system("cls"); } }
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯