역 폴란드 식 - 스 택 이용 실현
#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 를 쓸 때 논리 가 잘못 되 기 쉬 우 며 두 개의 문장 이 위 치 를 바 꾸 면 문제 가 생 길 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Docker를 사용한 React 및 .NET Core 6.0 샘플 프로젝트 - 1부이 기사에서는 Entity Framework Core Code First 접근 방식을 사용하는 ASP.NET Core 6.0 WEP API의 CRUD(만들기, 읽기, 업데이트 및 삭제) 작업에 대해 설명합니다. 웹 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.