《中綴式變後綴式》解題報告

嚴格的說,這不能說是解題報告,因爲我的代碼還沒有獲得AC,一直是WrongAnswer,但是我找了很多的測試數據,和其他程序的結果是一樣的,很鬱悶吧。大夥也可以看看我的程序,看看我是不是有什麼地方沒考慮到。

題目地址 http://acm.nyist.net/JudgeOnline/problem.php?pid=467

我的代碼:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include<memory.h>

char* convert(char *str);
int superior(char c);
char pop(char *str);
void push(char *str,char c);
char take(char *stack);

int main()
{
	char str[1000];
	int n;
	char *destStr;
	scanf("%d\n",&n);
	for(;n > 0;n --)
	{
		gets(str);
		destStr = convert(str);
		printf(destStr);
		printf("\n");
		free(destStr);
	}
	return 0;
}

char* convert(char *str)
{
	char stack[1000] = {'\0'};
	char *destStr = (char *)malloc(1000);
	memset(destStr,0,1000);
	
	if(destStr == NULL)
	{
		printf("Error 1 ...\n");
		exit(0);
	}
	
	while(*str != '=' && *str != '\0')
	{
		if(isdigit(*str) || *str == '.')
		{
			while(isdigit(*str) || *str == '.')
			{
				push(destStr,*str);
				str++;
			}
			str--;
			push(destStr,' ');
		}
		else if(*str == '(')
		{
			push(stack,'(');
		}
		else if(*str == ')')
		{
			while(take(stack) != '(')
			{
				push(destStr,pop(stack));
				push(destStr,' ');
			}
			pop(stack);
		}
		else if(*str == '+' || *str == '-' || *str == '*' || *str == '/')
		{
			if(strlen(stack) == 0 || superior(*str) > superior(take(stack)))
			{
				push(stack,*str);
			}
			else
			{
				while(take(stack) != '(' && take(stack) != '\0')
				{
					push(destStr,take(stack));
					push(destStr,' ');
					pop(stack);
				}
				push(stack,*str);		
			}
		}
		//一個棧最多有兩個元素
		//而且那一個最後纔會彈出。。。
		//
		else
		{
			printf("Testing%cTesting\n",*(str));
			printf("Error 2 ... \n");
			exit(0);
		}
		str++;
	}
	while(take(stack) != '\0' && take(stack) != '(')
	{
		if(strlen(stack) != 0)
		{
			push(destStr,take(stack));
			push(destStr,' ');
			pop(stack);
		}
		else
			break;
	}
	push(destStr,'=');
	push(destStr,'\0');
	return destStr;
}

int superior(char c)
{
	if(c == '+' || c == '-')
	{
		return 1;
	}
	else if(c == '*' || c == '/')
	{
		return 2;
	}
	else if(c == '(' || c == '\0')
	{
		return 3;
	}
	else
	{
		printf("Error 3 ...\n");
		printf("Testing%dTesting\n",c);
		return -1;
	}
}

void push(char *str,char c)
{
	str[strlen(str)] = c;
	str[strlen(str)] = '\0';
}

char pop(char *str)
{
	char c;
	c = str[strlen(str) - 1];
	str[strlen(str) - 1] = '\0';	
	return c;
}

char take(char *stack)
{
	if(strlen(stack) == 0)
		return '\0';
	else
		return stack[strlen(stack) - 1];
}

這個OJ是老師推薦的,我覺得不錯的功能之一是可以看問題的難度。我一直是做難度爲3的題目。

爭取每天AC一道題!

發佈了47 篇原創文章 · 獲贊 10 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章