c语言前缀编码,C语言实现中缀表达式转前缀表达式

1、实现的基本思想

(1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2;

(2) 从右至左扫描中缀表达式;

(3) 遇到操作数时,将其压入S2;

(4) 遇到运算符时,比较其与S1栈顶运算符的优先级:

(4-1) 如果S1为空,或栈顶运算符为右括号“)”,则直接将此运算符入栈;

(4-2) 否则,若优先级比栈顶运算符的较高或相等,也将运算符压入S1;

(4-3) 否则,将S1栈顶的运算符弹出并压入到S2中,再次转到(4-1)与S1中新的栈顶运算符相比较;

(5) 遇到括号时:

(5-1) 如果是右括号“)”,则直接压入S1;

(5-2) 如果是左括号“(”,则依次弹出S1栈顶的运算符,并压入S2,直到遇到右括号为止,此时将这一对括号丢弃;

(6) 重复步骤(2)至(5),直到表达式的最左边;

(7) 将S1中剩余的运算符依次弹出并压入S2;

(8) 依次弹出S2中的元素并输出,结果即为中缀表达式对应的前缀表达式。

2、我的代码

#include

#include

#include

char infix[20] = "(A+B)*C"; //初始化中缀表达式

int top = -1;

char prefix[20]; //存放前缀表达式

char opstack[20]; //存放运算符

char pop()

{

return (opstack[top--]);

}

void push(char symbol)

{

opstack[++top] = symbol;

}

int isopr(char s)

{

if(s == '+' || s == '-' || s == '*' || s == '/' )

{

return 1;

}else return 0;

}

int prcd(char s) //运算符优先级判断

{

switch(s)

{

case '+':return 1;break;

case '-':return 1;break;

case '*':return 2;break;

case '/':return 2;break;

case '=':return 0;break;

}

}

void intopre()

{

char sym;

int j = 0;

opstack[++top] = '=';

for(int i=strlen(infix)-1; i>=0 ; i--)

{

sym = infix[i];

if(isopr(sym) == 0) //遇到操作数直接压入prefix

{

prefix[j] = sym;

j++;

}else //else1

{

if(sym == ')') //遇到右括号,将其压栈

{

push(sym);

}else if(sym == '(') //遇到左括号, 则依次弹出stack栈顶的运算符,并压入prefix,直到遇到右括号为止

{

while(opstack[top] != ')')

{

prefix[j] = pop();

j++;

}

pop();

}else if(prcd(sym) >= prcd(opstack[top])) //遇到运算符,优先级大于栈顶运算符,将其压栈

{

push(sym);

}else //遇到运算符,优先级小于栈顶运算符

{

while( prcd(sym) < prcd(opstack[top]) )

{

prefix[j] = pop();

j++;

}

}

}//else1结束

}//for循环结束

}

int main(void)

{

intopre();

printf("%s",prefix);

return 0;

}

3、我的问题

在草稿纸上演算过几遍,百思不得其解。

本应该得到答案:

*+ABC

但是编译运行后得到

C)B*A(

麻烦各位了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值