Link: http://www.spoj.com/problems/ONP/
Giải thích SPOJ ONP
Chuyển cách biểu diễn 1 biểu thức từ infix sang postfix ( các bạn google để hiểu thêm hihi).
Thứ tự biểu thức quy định bởi dấu ngoặc đơn. ().
Ví dụ:
(a+b) —–> ab+
((a+t)*((b+(a+c))^(c+d))) —–> at+bac++cd+^*
((a+(b-c))*((d-e)/((f-g)+h))) ——> abc-+de-fg-h+/*
Lưu ý: Khi cho các bộ test, các bạn phải đặt đầy đủ dấu ngoặc ( ).
a+b+c –> wrong answer
(a+b+c) –> wrong answer
((a+b)+c) –> right answer
Các bạn có thể kiểm tra kết quả trong link sau: http://www.mathblog.dk/tools/infix-postfix-converter/
Thuật toán SPOJ ONP
Đọc từng dòng, duyệt từ đấu đến cuối chuỗi:
- Nếu gặp kí tự trong bảng chữ cái ‘a’ – ‘z’ thì in ra.
- Nếu gặp các phép toán thì bỏ vào stack.
- Nếu gặp kí tự ‘)’ thì lấy 1 phần tử ở đầu của stack ra.
Code tham khảo SPOJ ONP
#include<iostream>
#include<string>
#include<stack>
using namespace std;
int t;
string in;
int main()
{
cin >> t;
cin.ignore();
while (t--)
{
stack<char> p;
getline(cin, in);
for (int i = 0; i < in.length(); i++)
{
if (in[i] >= 'a' && in[i] <= 'z')
{
cout<<in[i];
}
else if (in[i]==')')
{
cout<<p.top();
p.pop();
}
else if(in[i]!='(')
p.push(in[i]);
}
cout<<endl;
}
return 0;
}
