1. 程式人生 > >資料結構-切分表示式——寫個tokenizer吧

資料結構-切分表示式——寫個tokenizer吧

7-6 切分表示式——寫個tokenizer吧 (20 分)

[先說點出題背景]

這個題是為低年級同學、學C語言的同學準備的,因為,對這部分同學,這個題目編寫起來略有一點複雜。如果是高年級、學過了正則表示式(Regular Expression)的同學或者學過了Java等OO語言的同學做這個題,應當發現這題比較簡單吧。哦,對了,什麼是tokenizer?請自行查詢解決。反正在此處不應翻譯成“令牌解析器”。

[正題]

四則運算表示式由運算數(必定包含數字,可能包含正或負符號小數點)、運算子(包括+-*/)以及小括號(())組成,每個運算數、運算子和括號都是一個token(標記)。現在,對於給定的一個四則運算表示式,請把她的每個token切分出來。題目保證給定的表示式是正確的,不需要做有效性檢查。

輸入格式:

在一行中給出長度不超過40個字元的表示式,其中沒有空格,僅由上文中token的字元組成

輸出格式:

依次輸出表達式中的tokens,每個token佔一行。

輸入樣例:

32*((2-2)+5)/(-15)

輸出樣例:

32
*
(
(
2
-
2
)
+
5
)
/
(
-15
)

本來以為要用棧或者佇列,其實只要遍歷一遍陣列就可以了。

需要注意的第一個地方就是第一個字元是正負號時的處理,

第二個是如果是數字或者小數點的話判斷下一位是不是小數點或者數字

第三個是負數的判斷 根據前一位是數字還是其他符號

第四個是正數的判斷 根據前一位是不是‘(’

最後其他字元直接輸出就好了

#include<stdio.h>
#include<string.h>
int main()
{
	char s[50];
	scanf("%s",s);
	int n = strlen(s);
	int flag = 0;
	for(int i = 0; i < n; i ++)
	{
		if((s[0]=='-'||s[0]=='+')&&!flag)
		{
			printf("%c",s[0]);
			flag = 1;
			continue;
		}
		if((s[i]>='0'&&s[i]<='9'||s[i]=='.')&&i!=n-1)
		{
			if(s[i+1]>='0'&&s[i+1]<='9'||s[i+1]=='.')
				printf("%c",s[i]);
			else
				printf("%c\n",s[i]);
		}
		else if(s[i]=='-')
		{
			if(s[i-1]>='0'&&s[i-1]<='9')
				printf("%c\n",s[i]);
			else
				printf("%c",s[i]);
		}
		else if(s[i]=='+')
		{
			if(s[i-1]=='('&&(s[i+1]>='0'&&s[i+1]<='9'))
				printf("+");
			else 
				printf("+\n");
		
		}
	
		else 
			printf("%c\n",s[i]);
	}
 }