100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > c语言前缀编码 C语言实现中缀表达式转前缀表达式

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

时间:2019-10-20 14:53:16

相关推荐

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(

麻烦各位了。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。