문제 풀이/C#
[1918] - 후위 표기식
Chamber
2022. 11. 1. 18:21
https://www.acmicpc.net/problem/1918
1918번: 후위 표기식
첫째 줄에 중위 표기식이 주어진다. 단 이 수식의 피연산자는 알파벳 대문자로 이루어지며 수식에서 한 번씩만 등장한다. 그리고 -A+B와 같이 -가 가장 앞에 오거나 AB와 같이 *가 생략되는 등의
www.acmicpc.net
접근 방법
중위 표기식에서 후위 표기식 만들 때 규칙
- 피연산자 만나면 그대로 출력
- 연산자를 만나면 스택에 저장
- 이 때, 스택의 연산자가 들어오는 연산자보다 우선순위가 크거나 같으면 -> 스택의 연산자 꺼내고 입력된 연산자 넣기
- 오른쪽 괄호(닫는 괄호)가 나오면 왼쪽 괄호 위에 쌓여있는 모든 연산자 꺼내기
문제 풀이
- 출력할 리스트와 스택을 생성
- 피연산자 - 알파벳들을 만나면 리스트에 add
- 연산자를 만나면 위 후위표기식 만드는 규칙에 따라서 적용
- 마지막 스택에 남아있는 연산자들 꺼내고 출력
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Baekjoon.Gold
{
class _1918
{
static void Main(string[] args)
{
char[] c = Console.ReadLine().ToCharArray();
List<char> list = new List<char>();
Stack<char> stack = new Stack<char>();
for(int i = 0; i<c.Length; i++)
{
//알파벳이면 리스트 넣기
if (c[i] != '+' && c[i] != '-' && c[i] != '*' && c[i] != '/' && c[i] != '(' && c[i] != ')')
list.Add(c[i]);
else
{
//여는 괄호면 넣기
if (c[i] == '(')
stack.Push(c[i]);
//+, -면 안에 ( 나올때까지 pop 후 리스트 추가
else if (c[i] == '+' || c[i] == '-')
{
while (stack.Count > 0)
{
if (stack.Peek() == '(')
break;
list.Add(stack.Pop());
}
stack.Push(c[i]);
}
//*, / 이면 (, 우선순위가 낮은거 나올때 까지 pop 리스트 추가
else if (c[i] == '*' || c[i] == '/')
{
while (stack.Count > 0)
{
if (stack.Peek() == '(' || stack.Peek() == '+' || stack.Peek() == '-')
break;
list.Add(stack.Pop());
}
stack.Push(c[i]);
}
// )면 여는괄호 나올 때까지 pop 리스트 추가
else if (c[i] == ')')
{
while (stack.Count > 0)
{
if(stack.Peek() == '(')
{
stack.Pop();
break;
}
list.Add(stack.Pop());
}
}
}
}
//남은 연산자들 꺼내기
while (stack.Count > 0)
list.Add(stack.Pop());
Console.WriteLine(string.Join("", list));
}
}
}