棧的學習筆記

Deuterium_suika發表於2019-03-31

中綴表示式轉為字尾表示式

棧的學習筆記
棧的學習筆記
棧的學習筆記

Status Transform(SqStack *s1,SqStack *s2)
{
	//s1為中綴表示式,s2儲存轉化的字尾表示式 
	char c,data;
	printf("輸入中綴表示式,以#為結束標誌");	
	scanf("%c",&c);
	while(c != '#') 
	{
		if(isdigit(c))
		{
			//如果為數字壓棧s2 
			pushStack(&s2,c);
		}
		else if(c == ')')
		{
			popStack(&s1,&data);
			while(data != '(')
			{
				pushStack(&s2,data);
				popStack(&s1,&data);
			}
		}
		else if('+' || '-')
		{
			//'+''-'優先順序低
			if(isEmptyStack(&s1)) 
			{
				//如果為空 
				pushStack(&s2,c);
			}
			else
			{
				do
				{
					popStack(&s1,&data);
					if(data == '(')
					{
						pushStack(&s1,c);
					}
					else
					{
						pushStack(&s2,data);
					}
				}while(isEmptyStack(&s1)|| data == '(');
				pushStack(&s1,c);
			}
		}
		else if(c == '*'||c=='/'||c=='(')
		{
			pushStack(&s1,c);
		}
		else
		{
			printf("出錯");
			return ERROR; 
		}
	}
}
複製程式碼

字尾表示式的計算

用棧來進出運算的數字

1.從左到右遍歷中綴表示式的每一個數字和符號

2.若是數字,則進棧

3.若是符號,則把處於棧頂的兩個數字出棧,進行運算

4.運算結果進棧

5.直到獲得最終結果

棧的學習筆記
棧的學習筆記

Status calculate(SqStack *s2)
{
	char c=0;
	int i;
	double d,e;
	char str[20];
	c = *++(s2->base);//從棧底讀取字尾表示式  
	while(c != '#')
	{
		while ( isdigit(c) || c == '.')
		{
			//過濾數字,剩下操作符 
			str[i++] = c;
			str[i] = '\0';//atof處理字串 
			if(i >= 20){
				printf("資料過大\n");
				return ERROR; 
			}
			scanf("%c",&c);
			if( c == ' ')
			{
				//讀到空格
				d = atof(str);
				pushStack(&s2, d);
				i = 0;
				break; 
			}
		}
		switch(c)
		{
			case '+':
				popStack(&s2,&e);
				popStack(&s2,&e);
				pushStack(&s2, d+e);
				break;
			case '-':
				popStack(&s2,&e);
				popStack(&s2,&d);
				pushStack(&s2, d-e);//先入棧作被減數
				break;
			case '*' :
				popStack(&s2,&e);
				popStack(&s2,&e);
				pushStack(&s2, d*e);
				break;
			case '/':
				popStack(&s2,&e);
				popStack(&s2,&e);
				if(e!=0) pushStack(&s2, d/e);
				else 
				{
					printf("除數為0");
					return ERROR;
				}
				break; 
		}
		c = *++(s2->base);	
 	}
 	c = *++(s2->base);
 	printf("計算結果為:%f\n",d);
}
複製程式碼

相關文章