역 폴란드 식 - 스 택 이용 실현

역 폴란드 식, 즉 접미사 표현 식.코드 는 다음 과 같 습 니 다:
#include <stack>
#include <map>
#include <conio.h>
#include <string.h>
#include <ctype.h>
#define MAX 1000
using namespace std;

//    
void rpn_print_stack(char *input);

int main()
{
	char test[]="(a+b)*c-(a+b)/e#";//    
	rpn_print_stack(test);
	getch();
}


//      (     )
void rpn_print_stack(char *input)
{
	//  
	int length=strlen(input);//      
	stack<char> s1;//     
	stack<char> s2;//         
	//  map     
	map<char,int> operation;
	operation['#']=0;
	operation['(']=1;
	operation['+']=2;
	operation['-']=2;
	operation['*']=3;
	operation['/']=3;

	//    
	s1.push('#');//     #, #      
	for(int i=0;i<length;i++)
	{
		char top_char=s1.top();//  s1     
		if(isalpha(input[i]))  //      ,   s2
		{
			s2.push(input[i]);
		}
		else if(input[i]=='#')//        
		{
			while(top_char!='#')
			{			
				s2.push(top_char);
				s1.pop();
				top_char=s1.top();
			}
		}
		else if(input[i]=='(') //   '(',   s1
		{
			s1.push('(');
		}
		else if(input[i]==')')  //            s2
		{
			while(top_char!='(' )
			{
				s2.push(top_char);
				s1.pop();
				top_char=s1.top();
			}
			s1.pop();//     ')'   '('
		}
		else if(operation[input[i]]>operation[top_char])  //               ,  s1
		{
			s1.push(input[i]);
		}
		else if(operation[input[i]]<=operation[top_char])  //               
		{
			while(operation[input[i]]<=operation[top_char] && input[i]!='#')
			{
				s2.push(top_char);// s1    s2
				s1.pop();
				top_char=s1.top();		
			}
			s1.push(input[i]);
		}
		
		
	}
	//  s2,      
	char result[MAX];
	int j=0;
	char top_char=s2.top();
	while(!s2.empty())
	{
		result[j]=top_char;
		j++;
		s2.pop();
		if(s2.size()>0)//    ,           ,     top
			top_char=s2.top();
	}
	//      
	for(int m=j-1;m>=0;m--)
		printf("%c",result[m]);
	
}

      결론: 알고리즘 은 매우 간단 하지만 여러 개의 if else 를 쓸 때 논리 가 잘못 되 기 쉬 우 며 두 개의 문장 이 위 치 를 바 꾸 면 문제 가 생 길 수 있 습 니 다.

좋은 웹페이지 즐겨찾기