文档章节

查找符号的优先级

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
UML类图符号理论

前言 相信大家在学习UML类图的时候,最大的困难可能来自两个方面: 类图中各种关系的区别; 多种关系的符号记忆容易混淆; 本着"Do one thing and do it well."的原则,本文不介绍UML类图中各...

算法与编程之美
2016/02/18
276
3

没有更多内容

加载失败,请刷新页面

加载更多

数字转换为字符的L受哪个参数影响

我们知道,如果想把金额带上本位币,一般加上L, 比如: select to_char(salary,'L99,9999.00') from employees; 下面显示如下: SALARY TO_CHAR(SALARY,'L99, 2900 ¥2,900.00 2500 ¥2,500.00 ...

tututu_jiang
28分钟前
2
0
shell编程(告警系统主脚本、告警系统配置文件、告警系统监控项目)

告警系统主脚本 先定义监控系统的各个目录,然后再去定义主脚本,因为是分布式的,所以需要每台机器都这样做,如果事先有创建好各个目录和各个脚本,那么就可以把这些目录和脚本copy到其他机...

蛋黄_Yolks
29分钟前
2
0
SAP HANA Backup and Recovery

SAP HANA Backup and Recovery Skip to end of metadata Created by Paul Power, last modified on Nov 23, 2017 Go to start of metadata Purpose System Privileges How to Perform a Back......

rootliu
30分钟前
2
0
JVM的持久代——何去何从?

本文会介绍一些JVM内存结构的基本概念,然后很快会讲到持久代,来看下Java SE 8发布后它究竟到哪去了。 基础知识 JVM只不过是运行在你系统上的另一个进程而已,这一切的魔法始于一个java命令...

java知识分子
47分钟前
2
0
Hive和HBase的区别

hive是文件的视图,hbase是建了索引的key-value表。 先放结论:Hbase和Hive在大数据架构中处在不同位置,Hbase主要解决实时数据查询问题,Hive主要解决数据处理和计算问题,一般是配合使用。...

飓风2000
53分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部