#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct StackNode {
char data;//数据域
struct StackNode* next;//指针域
}StackNode, * StackLink;//用于指向该类型结构体
typedef struct StackNodePre node;
struct StackNodePre {
StackLink top;// 栈顶指针
int amount;//计算栈内元素的数量
};
//传入栈顶指针和压入值
node* Push(node* S, char PushAmount)//入栈
{
if (S->amount == 0) {//栈为空
StackNode* p = (StackNode*)malloc(sizeof(StackNode));
if (p) {
S->top = p;//指向p空间
p->next = NULL;//空
p->data = PushAmount;//赋值
++S->amount;//栈内元素减一
}
return S;
}
else {
StackNode* p = (StackNode*)malloc(sizeof(StackNode));
if (p) {//上同
p->next = S->top;
p->data = PushAmount;
S->top = p;
++S->amount;
}
return S;
}
}
node* Pop(node* S)//出栈
{
if (S->amount == 0) {
return S;
}
else {
StackLink p;
p = S->top;//保存
if (S->top->data != '(') {
printf(" %c", p->data);//出栈
}
S->top = S->top->next;//移动栈顶指针
free(p);//释放空间
--S->amount;
return S;
}
}
int main()
{
int i, flag=1;//此处flag变量可删除,其作用是区分上一个字符,以便将十位以上的数字与个位数字区分
char midExpression[21];//中缀表达式
node* p = (node*)malloc(sizeof(node));//创一栈顶指针
if (p) {//初始化
p->top = NULL;
p->amount = 0;
/*请注意:输入时请把输入法调成英文模式*/
scanf_s("%s", midExpression, 19);
midExpression[20] = '\0';
printf("\n");
for (i = 0; midExpression[i] != '\0'; i++) {
if (midExpression[i] >= '0' && midExpression[i] <= '9') {//判断是否在0~9之间
if (flag == 1) {//区分十位以上数字和个位数
printf("%c", midExpression[i]);
}
else {
printf(" %c", midExpression[i]); flag = 1;
}
}
else if (midExpression[i] == '(') {//判断是否为左括号
p = Push(p, midExpression[i]); flag = 0;
}
else if (midExpression[i] == ')') {//判断是否为右括号
while (p->amount && p->top->data != '(') {
p = Pop(p);
}
p = Pop(p);
flag = 0;
}
else if (midExpression[i] == '*' || midExpression[i] == '/') {//判断是否为*或/
if ( p->amount == 0 || p->top->data == '(' || p->top->data == '+' || p->top->data == '-') {
p = Push(p, midExpression[i]); //入栈
}
else if (p->top->data == '*' || p->top->data == '/') {
while (p->amount!=0&&(p->top->data=='*'||p->top->data=='/')) {
p = Pop(p);//如果优先级比该运算符大或相等,则出栈
}
p = Push(p, midExpression[i]);//再将该运算符其入栈
}
flag = 0;
}
else if (midExpression[i] == '+' || midExpression[i] == '-') {//判断是否为+或-
if (p->amount == 0 || p->top->data == '(') {
p = Push(p, midExpression[i]);//入栈
}
else if (p->top->data == '+' || p->top->data == '-' || p->top->data == '*' || p->top->data == '/') {
while (p->amount != 0 &&( p->top->data == '*' || p->top->data == '/' || p->top->data == '+' || p->top->data == '-')) {
p = Pop(p);//如果优先级比该运算符大或相等,则出栈
}
p = Push(p, midExpression[i]);//再将该运算符入栈
}
flag = 0;
}
}
while (p->amount) {//将剩余的栈内运算符弹出
p = Pop(p);
}
}
return 0;
}
小白易懂:中缀表达式(正常表达式)转换为 后缀表达式(逆波兰表达式)
最新推荐文章于 2022-12-22 10:18:35 发布