-
Notifications
You must be signed in to change notification settings - Fork 0
/
PTIT121E.cpp
111 lines (93 loc) · 3.63 KB
/
PTIT121E.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <iostream>
#include <map>
#include <stack>
using namespace std;
// Prototype của các hàm con
stack<long long> convertFormulaToStack(string chemicalFormula);
bool isAtom(char letter);
long long calculateMolecularMass(stack<long long> chemicalStack);
int main()
{
// Nhập vào công thức hóa học
string chemicalFormula;
cin >> chemicalFormula;
// Convert công thức hóa học sang stack
stack<long long> chemicalStack = convertFormulaToStack(chemicalFormula);
// Tính khối lượng của hóa chất dựa vào stack
long long molecularMass = calculateMolecularMass(chemicalStack);
cout << molecularMass;
return 0;
}
// Hàm convert công thức hóa học sang stack
stack<long long> convertFormulaToStack(string chemicalFormula)
{
stack<long long> chemicalStack;
map<char, long long> atomicMass;
atomicMass['H'] = 1;
atomicMass['C'] = 12;
atomicMass['O'] = 16;
chemicalFormula = " " + chemicalFormula; // Thêm khoảng trắng để xuống dưới vòng lặp bắt đầu chạy từ index = 1
for (long long i = 1; i <= chemicalFormula.size(); i++)
{
// Gặp dấu mở ngoặc đơn thì thêm số -1 vào đỉnh stack
if (chemicalFormula[i] == '(')
{
chemicalStack.push(-1);
}
// Gặp các ký tự 'H' hoặc 'C' hoặc 'O' thì thêm khối lượng của chúng vào đỉnh stack
if (isAtom(chemicalFormula[i]))
{
chemicalStack.push(atomicMass[chemicalFormula[i]]);
}
// Gặp các số từ 1 đến 9, thì lấy phần tử ở đỉnh stack ra để nhân với số này, sau đó push ngược lại vào đỉnh stack
if (chemicalFormula[i] >= '1' && chemicalFormula[i] <= '9')
{
if (!chemicalStack.empty())
{
long long temp = chemicalStack.top();
chemicalStack.pop();
temp *= (chemicalFormula[i] - '0');
chemicalStack.push(temp);
}
}
// Gặp dấu đóng ngoặc đơn thì chạy vòng lặp để cộng dồn các số lưu trong stack, đến khi nào gặp số -1 (đại diện cho dấu ngoặc đơn)
if (chemicalFormula[i] == ')')
{
long long temp = 0;
while (!chemicalStack.empty() && chemicalStack.top() != -1)
{
long long top = chemicalStack.top();
chemicalStack.pop();
temp += top;
}
// Kiểm tra nếu stack vẫn chưa rỗng, thì xóa bỏ số -1 (đại diện cho dấu ngoặc đơn) khỏi stack, rồi đẩy số temp đã tính được ở trên vào stack
if (!chemicalStack.empty() && chemicalStack.top() == -1)
{
chemicalStack.pop();
chemicalStack.push(temp);
}
}
}
return chemicalStack;
}
// Hàm kiểm tra ký tự truyền vào có phải là nguyên tố hóa học 'H' hoặc 'C' hoặc 'O' hay không
bool isAtom(char letter)
{
return letter == 'H' || letter == 'C' || letter == 'O';
}
// Hàm tính khối lượng của hóa chất dựa vào stack
long long calculateMolecularMass(stack<long long> chemicalStack)
{
long long molecularMass = 0;
// Duyệt qua các số còn lại trong stack để cộng dồn tính ra khối lượng của hóa chất ban đầu
while (!chemicalStack.empty())
{
long long temp = chemicalStack.top();
chemicalStack.pop();
if (temp != -1)
{
molecularMass += temp;
}
}
return molecularMass;
}