算术表达式中缀转换成后缀

#include<stdio.h>
#include<string.h>
#include<stack>

using namespace std;

int OP[7][7]{
    1,1,0,0,0,-1,1,// 以矩阵来表示 运算符之间的关系。 
    1,1,0,0,0,-1,1,// 1 表示 栈顶元算符比 刚刚下一个元算符 高级 可以运算 
    1,1,1,1,0,-1,1,// 0 表示 栈顶 运算符低级 就 将下一个 运算符入栈。  
    1,1,1,1,0,-1,1,// -1 表示 拥有 一对括号匹配 将 括号内容输出 
    0,0,0,0,0,-1,9,
    1,1,1,1,9,-1,1,
    0,0,0,0,0,9,2
};

int Name( char a ){
	int n;
	switch( a )
	{
		case '+': n=0; break;
		case '-': n=1; break;
		case '*': n=2; break;
		case '/': n=3; break;
		case '(': n=4; break;
		case ')': n=5; break;
		case '#': n=6; break;
		default : n=-1; 
	}
	return n;
}


int Precede( char a, char b){
	int an1,an2;
	an1=Name(a);
	an2=Name(b);
	return OP[an1][an2];
} 



int main(){
	char a[100];
	char Stack[100];
	int top;
	int len;
	printf("以#号结束、、、、\n"); 
	scanf("%s",a);
	len=strlen(a);
	//a+b*printf("%d",len);
	
	top=-1;
	Stack[++top]='#';
	for( int i=0; i<len; ++i )
	{
	    if( Name(a[i])==-1 )
	      printf("%c",a[i]);
	    else
	    {
	    	switch( Precede(Stack[top],a[i]) )
	    	{
	    		case 0: Stack[++top]=a[i]; break;
	    		case 9: printf("error\n"); break;
	    		case 1:  
	    		       printf("%c",Stack[top]);
	    		       --top;
	    		       while( Precede(Stack[top],a[i])==1 )
	    		       {
	    		       	   printf("%c",Stack[top]);
	    		       	   --top;
					   }
					   Stack[++top]=a[i];
					   break;
			    case -1: 
				      while( Stack[top]!='(' )
				      {
				      	  printf("%c",Stack[top]);
				      	  top--;
					  }
					  top--;
					 break;
				case 2: 
			       break;	     
			}
		}
	} 
	return 0;
} 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值