#include <iostream>
#include<iostream>
#include<stdio.h>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef char SElemType;
typedef int Status;
typedef struct SNode {
int data;
struct SNode *next;
} SNode, *LinkStack;
Status InitStack(LinkStack &S) {
S = NULL;
return OK;
}
Status StackEmpty(LinkStack S) {
if (!S)
return 1;
return 0;
}
Status Push(LinkStack &S, SElemType e) {
SNode *p = new SNode;
if (!p) {
return OVERFLOW;
}
p->data = e;
p->next = S;
S = p;
return OK;
}
Status Pop(LinkStack &S, SElemType &e) {
SNode *p;
if (!S)
return ERROR;
e = S->data;
p = S;
S = S->next;
delete p;
return OK;
}
Status GetTop(LinkStack S) { //返回S的栈顶元素,并不修改值
if (S != NULL)
return S->data;
}
//**************中缀表达式转化为后缀表达式*************
void TranslateExpress(char str[],char exp[])
{
LinkStack S;
char ch;
SElemType e;
int i = 0,j = 0;
InitStack(S);
ch=str[i];
i++;
while(ch != '\0')
{
switch(ch)
{
case '(': //左括号进栈
Push(S,ch);
break;
case ')': //右括号,将操作数出栈
while(GetTop(S)!='(' ) //
{
Pop(S,e);
exp[j]=e;
j++;
}
Pop(S,e);
break;
case '+':
case '-':
while(!StackEmpty(S) && GetTop(S) !='(')
{
Pop(S,e);
exp[j]=e;
j++;
}
Push(S,ch);
break;
case '*':
case '/':
while(!StackEmpty(S) &&(GetTop(S)=='/'||GetTop(S)=='*'))
{
Pop(S,e);
exp[j]=e;
j++;
}
Push(S,ch);
break;
//case ' ':break;
default:
while(ch>='a' && ch <= 'z')
{
exp[j] = ch;
j++;
ch = str[i];
i++;
}
i--; //此状态的值未进行switch,需回退,i--呼应2行前的i++,防止while死循环
//exp[j]=' ';
//j++;
}
ch=str[i];
i++;
}
while(!StackEmpty(S))
{
Pop(S,e);
exp[j]=e;
j++;
}
exp[j] = '\0';
}
int main()
{
char a[100],b[100];
gets(a);
TranslateExpress(a,b);
puts(b);
return 0;
}
数据结构-NOJ-08-逆波兰式
最新推荐文章于 2022-05-28 19:27:38 发布