文档章节

查找符号的优先级

Nibnat
 Nibnat
发布于 2013/12/30 19:04
字数 404
阅读 13
收藏 0
#include<stdio.h>
#include<string.h>

/*
another solution: just become array operator by their position and order,when you type two characters ,just find out their i and j,and get i*10 + j,and then 
compare this value,the bigger one get higher priority
*/
int AvoidSpe(char *ch);

char *operator[16][10] = { {"(",")","[","]","->","."},
						 {"!","~","++","--","+","-","*","&","(type)","sizeof"},
						 {"*","/","%%"},
						 {"+","-"},
						 {">>","<<"},
						 {"<","<=",">",">="},
						 {"==","!="},
						 {"&"},
						 {"^"},
						 {"|"},
						 {"&&"},
						 {"||"},
						 {"?:"},
						 {"=","+=","-=","*=","/=","%=","&="},
						 {"^=","|=","<<=",">>="},
						 {","}
					};

int order[17] = {0,                          //for start from 1,not 0
				 1,0,1,1,1,1,1,1,
				 1,1,1,1,0,0,1,1};           //1 is left to right,0 is right to left					

int FindLevel(char * ch)
{
	int tmp;
	if( strlen( ch ) == 1 )
	{
		if( *ch == '+' || *ch == '-' ||  *ch == '*' || *ch == '&' )
		{
			tmp = AvoidSpe( ch );
			
			return tmp;
		}
	}
	
	for( int i = 0 ; i < 16 ; i++ )
	{
		for( int j = 0 ; j < 10 ; j++ )
		{			
			
			if( !operator[i][j] )
			{
				continue;
			}
			
			//			for get both i and j
			if( !strcmp( ch,operator[i][j]) )
			{
				return ( i + 1 )*10 + j;	
			}
		}
	}
}

int AvoidSpe(char *ch)
{
	int tmp = 0;
	char *p;
	printf("%s is Unary operators or operator?(1 or 0)",ch);
	scanf("%d",&tmp);
	//*p = *ch;
	if( tmp == 1 )
	{
		switch( *ch )
		{
			case '+':
				return 2*10+4;
				break;
			case '-':
				return 2*10+5;
				break;
			case '*':
				return 2*10+6;
				break;
			case '&':
				return 2*10+7;
				break;
		}
	}
	else
	{
		switch( *ch )
		{
			case '+':
				return 4*10+0;
				break;
			case '-':
				return 4*10+1;
				break;
			case '*':
				return 3*10+0;
				break;
			case '&':
				return 8*10+0;
				break;
		}
	}
}

int check(char *s1,char *s2)
{
	int a = 0;
	int b = 0;
	for( int i = 0 ; i < 16 ; i++ )
	{
		for( int j = 0 ; j < 10 ; j++ )
		{			
			
			if( !operator[i][j] )
			{
				continue;
			}
			
			if( !strcmp( s1,operator[i][j]) && !a)
			{
				++a;	
			}
			
			if( !strcmp( s1,operator[i][j]) && !b)
			{
				++b;	
			}
			if( a && b )
				return 1;
		}
	}
	printf("wrong input!\n");
	return 0;
}

int main()
{	
	int posi_one = 0,posi_two = 0;
	int posj_one = 0,posj_two = 0;
	int tmp = 0;
	
	char ch_i[3],ch_j[3];
	printf("input first para:");
	scanf("%s",ch_i);
	printf("input second para:");
	scanf("%s",ch_j);
	
	if( !check(ch_i,ch_j) )
		return 1;
	tmp = FindLevel( ch_i );	
	printf("%d\n",tmp);
	posi_two = tmp % 10;
	tmp -= posi_two;
	tmp /= 10;
	posi_one = tmp;
	
	tmp = FindLevel( ch_j );	
	printf("%d\n",tmp);
	posj_two = tmp % 10;
	tmp -= posj_two;
	tmp /= 10;
	posj_one = tmp;
	
	//printf("%d %d\n",posi_one,posj_one);
	//printf("%d %d\n",posi_two,posj_two);
		
	if( posi_one > posj_one )
	{
		printf("%s > %s\n",ch_j,ch_i);
	}
	else if( posi_one < posj_one )
	{
		printf("%s > %s\n",ch_i,ch_j);
	}
	else
	{
		if( order[ posi_one ] )        //from left to right
		{
			printf("from left to right\n");
		}
		else
		{
			printf("from right to left\n");
		}
	}
	return 0;	
}


© 著作权归作者所有

共有 人打赏支持
Nibnat
粉丝 0
博文 27
码字总数 10770
作品 0
湘潭
私信 提问
正则学习笔记

一,正则表达式分三部分 分隔符;表达式:修饰符: 二,普通字符 普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其...

君满楼001
2017/11/16
0
0
目录帖:​​​​​​​浅谈算法和数据结构

浅谈算法和数据结构: 一 栈和队列 浅谈算法和数据结构: 二 基本排序算法 浅谈算法和数据结构: 三 合并排序 浅谈算法和数据结构: 四 快速排序 浅谈算法和数据结构: 五 优先级队列与堆排序 浅谈...

安小乐
09/04
0
0
nginx_server_location对客户资源的辨别规则

语法:location [ = | ~ | ~* | ^~ ] uri { …一组命令… } http://nginx.org/en/docs/http/ngxhttpcore_module.html#location location / {}:表示对/uri/目录及其子目录下的所有文件都匹配......

Jeson_lbb
08/06
0
0
windows下cmd命令提示符下让程序后台运行命令

如果你的程序需要在windows后台运行,并且是在cmd下启动,那么在执行的程序前加上start /b,比如start /b [程序名]。 windows下start命令的详细参数及功能介绍如下: 文章来源 www.169it.com ...

小星星程序员
2014/12/23
0
0
数据结构与算法之中缀表达式转换为后缀表达式

一、中缀表达式转换为后缀表达式 1.中缀表达式和后缀表达式 中缀表达式是符合人类正常逻辑思维的; 后缀表达式则是比较契合计算机的运算。 2.中缀表达式转换为后缀表达式 思考:我们要如何将...

aibinxiao
06/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS配置Tomcat监听80端口,虚拟主机

Tomcat更改默认端口为80 更改的配置文件是: /usr/local/tomcat/conf/server.xml [root@test-a ~]# vim /usr/local/tomcat/conf/server.xml # 找到 Connector port="8080" protocol="HTTP/1......

野雪球
25分钟前
2
0
《稻盛和夫经营学》读后感心得体会3180字范文

《稻盛和夫经营学》读后感心得体会3180字范文: 一代日本经营之圣稻盛和夫凭借刻苦勤奋的精神以及深植于佛教的商业道德准则,成为了“佛系”企业家的代表人物。在《稻盛和夫经营学》“领导人...

原创小博客
今天
1
0
java框架学习日志-5(常见的依赖注入)

依赖注入(dependency injection) 之前提到控制反转(Inversion of Control)也叫依赖注入,它们其实是一个东西,只是看的角度不同,这章详细说一下依赖注入。 依赖——指bean对象创建依赖于...

白话
今天
2
0
红外接收器驱动开发

背景:使用系统的红外遥控软件没有反应,然后以为自己接线错误,反复测试,结果烧坏了一个红外接收器,信号主板没有问题。所以自己开发了一个红外接收器的python驱动。接线参见https://my.os...

mbzhong
今天
2
0
ActiveMQ消息传送机制以及ACK机制详解

AcitveMQ是作为一种消息存储和分发组件,涉及到client与broker端数据交互的方方面面,它不仅要担保消息的存储安全性,还要提供额外的手段来确保消息的分发是可靠的。 一. ActiveMQ消息传送机...

watermelon11
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部