严题集3-21中缀表达式转换为逆波兰(后缀)表达式

严题集3-21中缀表达式转换为逆波兰(后缀)表达式

char Procede(char a,char b)
{  
    char priority[7][7]=
	{ // 建立 priority [ ] [ ] 和 +、 -、 *、 / 运算符间的映射关系
    {'>','>','<','<','<','>','>'},  
    {'>','>','<','<','<','>','>'},  
    {'>','>','>','>','<','>','>'},  
    {'>','>','>','>','<','>','>'},  
    {'<','<','<','<','<','=','0'},  // 此行"(" = ")"表示左右括号相遇,括号内运算已完成 
    {'>','>','>','>','0','>','>'},  
    {'<','<','<','<','<','0','='}   // “#" = "#” 表示整个表达式求值完毕 
	};                              //  "0"表示不可能出现这种情况 ( 语法错误 )                     
	int i,j;  
    switch(a)
	{  
        case'+':i=0;break;  
        case'-':i=1;break;  
        case'*':i=2;break;  
        case'/':i=3;break;  
        case'(':i=4;break;  
        case')':i=5;break;  
        case'#':i=6;break;   // # 是表达式的结束符 
    }  
    switch(b)
	{  
        case'+':j=0;break;  
        case'-':j=1;break;  
        case'*':j=2;break;  
        case'/':j=3;break;  
        case'(':j=4;break;  
        case')':j=5;break;  
        case'#':j=6;break;  
    }  
    return priority[i][j];  
}

Status Reverse_Polish_Notation(char *input,char *output) //3-21中缀表达式转换为逆波兰(后缀)表达式
{
	int length=strlen(input);
	if(length==0) return ERROR;  //  2*(9+6/3-5)+4
	SqStack S;
	char e;
	InitStack(S);
	Push(S,'#');//方便后续操作 
	int count=0;
	for(int i=0;i<length;i++)
	{
		while((input[i]>='0'&&input[i]<='9')||(input[i]>='a'&&input[i]<='z')||(input[i]>='A'&&input[i]<='Z')&&i<length)
		output[count++]=input[i++];//数字字母直接输出 
		GetTop(S,e);
		if(i>=length)
		break;
		switch(Procede(e,input[i])) 
		{
			case '<': Push(S,input[i]);break;//栈顶元素优先权低,将新字符压入 
			case '=': Pop(S,e);break;        //去括号,pop出不输出 
			case '>': Pop(S,output[count++]);i--;break; 
			case '0': return ERROR;//出现语法错误 
		}
	}	
	if(! Is_Stack_Empty(S))  Pop(S,output[count++]);  //栈中若还有一个残留则输出 
	printf("%s\n",output);
	return OK;
} 
发布了6 篇原创文章 · 获赞 2 · 访问量 92

猜你喜欢

转载自blog.csdn.net/HUST_LHC/article/details/105320861