Advertisement
Antosiak

fas

Feb 19th, 2019
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.18 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. template <class T>
  6. class Element
  7. {
  8. public:
  9. T wartosc;
  10. Element *nastepny;
  11. };
  12.  
  13. template <class T>
  14. class Stos {
  15. public:
  16. Element<T> *pierwszy_element;
  17. int rozmiar;
  18. Stos()
  19. {
  20. pierwszy_element=nullptr;
  21. rozmiar=0;
  22. }
  23. bool pusty()
  24. {
  25. return !pierwszy_element;
  26. }
  27. Element<T> *wierzcholek_stosu()
  28. {
  29. return pierwszy_element;
  30. }
  31. void dodaj_element(T a)
  32. {
  33. Element<T> *tmp=new Element<T>;
  34. tmp->wartosc=a;
  35. tmp->nastepny=pierwszy_element;
  36. pierwszy_element=tmp;
  37. rozmiar++;
  38. }
  39. void usun_wierzcholek()
  40. {
  41. if(pierwszy_element)
  42. {
  43. Element<T> *tmp=pierwszy_element;
  44. pierwszy_element=pierwszy_element->nastepny;
  45. delete tmp;
  46. rozmiar--;
  47. }
  48. }
  49. };
  50.  
  51. template <class T>
  52. class Kolejka
  53. {
  54. public:
  55. Element<T> *pierwszy;
  56. Element<T> *ostatni;
  57. int rozmiar;
  58. Kolejka()
  59. {
  60. pierwszy=ostatni=nullptr;
  61. rozmiar=0;
  62. }
  63. bool pusty()
  64. {
  65. return !pierwszy;
  66. }
  67. Element<T> *piersza_wartosc()
  68. {
  69. if(pierwszy)
  70. {
  71. return pierwszy;
  72. }
  73. else
  74. {
  75. return nullptr;
  76. }
  77. }
  78. void dodaj_element(string a)
  79. {
  80. Element<T> *tmp=new Element<T>;
  81. tmp->nastepny=nullptr;
  82. tmp->wartosc=a;
  83. if(ostatni)
  84. {
  85. ostatni->nastepny=tmp;
  86. }
  87. else
  88. {
  89. pierwszy=tmp;
  90. }
  91. ostatni=tmp;
  92. rozmiar++;
  93. }
  94. void usun_wierzcholek()
  95. {
  96. if(pierwszy)
  97. {
  98. Element<T> *tmp=pierwszy;
  99. pierwszy=pierwszy->nastepny;
  100. if(!pierwszy)
  101. {
  102. ostatni=nullptr;
  103. }
  104. delete tmp;
  105. rozmiar--;
  106. }
  107. }
  108. };
  109. bool sprawdz_nawiasy(const string &dzialanie)
  110. {
  111. Stos<char> stos2;
  112. string nawiasy="";
  113. string _tmp;
  114. for(char c:dzialanie)
  115. {
  116. if(c=='(' || c=='[' || c=='{' || c==')' || c==']' || c=='}')
  117. {
  118. nawiasy=nawiasy+c;
  119. }
  120. }
  121. for(char c:nawiasy)
  122. {
  123. if(c=='(' || c=='[' || c=='{')
  124. {
  125. stos2.dodaj_element(c);
  126. }
  127. if(stos2.pusty())
  128. {
  129. return false;
  130. }
  131. if(c==')')
  132. {
  133. _tmp=stos2.wierzcholek_stosu()->wartosc;
  134. stos2.usun_wierzcholek();
  135. if(_tmp=="{" || _tmp=="[")
  136. {
  137. return false;
  138. }
  139. }
  140. else if(c=='}')
  141. {
  142. _tmp=stos2.wierzcholek_stosu()->wartosc;
  143. stos2.usun_wierzcholek();
  144. if(_tmp=="(" || _tmp=="[")
  145. {
  146. return false;
  147. }
  148. }
  149. else if(c==']')
  150. {
  151. _tmp=stos2.wierzcholek_stosu()->wartosc;
  152. stos2.usun_wierzcholek();
  153. if(_tmp=="(" || _tmp=="{")
  154. {
  155. return false;
  156. }
  157. }
  158. }
  159. return stos2.pusty();
  160. }
  161.  
  162. bool odwrocona_notacja_polska(const string &dzialanie, Kolejka<string> &kolejka)
  163. {
  164. Stos<string> Stos;
  165. string tmp1="";
  166. string::size_type zmienna;
  167. if(!sprawdz_nawiasy(dzialanie))
  168. {
  169. while(!kolejka.pusty())
  170. {
  171. kolejka.usun_wierzcholek();
  172. }
  173. cout<<"BLAD"<<endl;
  174. return false;
  175. }
  176.  
  177. for(int i=0; i<dzialanie.size(); i++)
  178. {
  179. if(dzialanie[i]=='(' || dzialanie[i]=='[' || dzialanie[i]=='{')
  180. {
  181. string tmp="";
  182. tmp += dzialanie[i];
  183. Stos.dodaj_element(tmp);
  184. }
  185. else if(dzialanie[i]==')')
  186. {
  187. while(!Stos.pusty())
  188. {
  189. if(Stos.wierzcholek_stosu()->wartosc=="(")
  190. {
  191. Stos.usun_wierzcholek();
  192. break;
  193. }
  194. else
  195. {
  196. kolejka.dodaj_element(Stos.wierzcholek_stosu()->wartosc);
  197. Stos.usun_wierzcholek();
  198. }
  199. }
  200. }
  201. else if(dzialanie[i]==']')
  202. {
  203. while(!Stos.pusty())
  204. {
  205. if(Stos.wierzcholek_stosu()->wartosc=="[")
  206. {
  207. Stos.usun_wierzcholek();
  208. break;
  209. }
  210. else
  211. {
  212. kolejka.dodaj_element(Stos.wierzcholek_stosu()->wartosc);
  213. Stos.usun_wierzcholek();
  214. }
  215. }
  216. }
  217. else if(dzialanie[i]=='+' || dzialanie[i]=='-')
  218. {
  219. while(!Stos.pusty())
  220. {
  221. if(Stos.wierzcholek_stosu()->wartosc=="(" || Stos.wierzcholek_stosu()->wartosc=="[" || Stos.wierzcholek_stosu()->wartosc=="{")
  222. {
  223. string tmp="";
  224. tmp += dzialanie[i];
  225. Stos.dodaj_element(tmp);
  226. break;
  227. }
  228. else
  229. {
  230. kolejka.dodaj_element(Stos.wierzcholek_stosu()->wartosc);
  231. Stos.usun_wierzcholek();
  232. }
  233. }
  234. if(Stos.pusty())
  235. {
  236. string tmp="";
  237. tmp += dzialanie[i];
  238. Stos.dodaj_element(tmp);
  239. }
  240. }
  241. else if(dzialanie[i]=='}')
  242. {
  243. while(!Stos.pusty())
  244. {
  245. if(Stos.wierzcholek_stosu()->wartosc=="{")
  246. {
  247. Stos.usun_wierzcholek();
  248. break;
  249. }
  250. else
  251. {
  252. kolejka.dodaj_element(Stos.wierzcholek_stosu()->wartosc);
  253. Stos.usun_wierzcholek();
  254. }
  255. }
  256. }
  257. else if(dzialanie[i]=='*' || dzialanie[i]=='/')
  258. {
  259. while(!Stos.pusty())
  260. {
  261. if(Stos.wierzcholek_stosu()->wartosc=="(" || Stos.wierzcholek_stosu()->wartosc=="[" || Stos.wierzcholek_stosu()->wartosc=="{" || Stos.wierzcholek_stosu()->wartosc=="-" || Stos.wierzcholek_stosu()->wartosc=="+")
  262. {
  263. std::string tmp="";
  264. tmp += dzialanie[i];
  265. Stos.dodaj_element(tmp);
  266. break;
  267. }
  268. else
  269. {
  270. kolejka.dodaj_element(Stos.wierzcholek_stosu()->wartosc);
  271. Stos.usun_wierzcholek();
  272. }
  273. }
  274. if(Stos.pusty())
  275. {
  276. string tmp="";
  277. tmp+=dzialanie[i];
  278. Stos.dodaj_element(tmp);
  279. }
  280. }
  281. else
  282. {
  283. tmp1=tmp1+dzialanie[i];
  284. if(i+1!=dzialanie.size())
  285. {
  286. if(dzialanie[i+1]<48 || dzialanie[i+1]>57)
  287. {
  288. kolejka.dodaj_element(tmp1);
  289. tmp1="";
  290. }
  291. }
  292. else
  293. {
  294. kolejka.dodaj_element(tmp1);
  295. tmp1="";
  296. }
  297. }
  298. }
  299. while(!Stos.pusty())
  300. {
  301. kolejka.dodaj_element(Stos.wierzcholek_stosu()->wartosc);
  302. Stos.usun_wierzcholek();
  303. }
  304. return true;
  305. }
  306.  
  307.  
  308. void oblicz(Kolejka<string> &kolejka)
  309. {
  310. Stos<double> Stos;
  311. long double wynik=0;
  312. long double a,b;
  313. string::size_type zmienna;
  314. if(kolejka.pusty())
  315. {
  316. cout<<endl;
  317. return;
  318. }
  319. if(kolejka.rozmiar==1 && stold(kolejka.piersza_wartosc()->wartosc,&zmienna))
  320. {
  321. cout<<kolejka.piersza_wartosc()->wartosc<<endl;
  322. kolejka.usun_wierzcholek();
  323. return;
  324. }
  325. for(;!kolejka.pusty();)
  326. {
  327. if(kolejka.piersza_wartosc()->wartosc != "*" && kolejka.piersza_wartosc()->wartosc != "/" && kolejka.piersza_wartosc()->wartosc != "+" && kolejka.piersza_wartosc()->wartosc != "-")
  328. {
  329. Stos.dodaj_element(stoi(kolejka.piersza_wartosc()->wartosc,&zmienna));
  330. kolejka.usun_wierzcholek();
  331. }
  332. if(kolejka.piersza_wartosc()->wartosc=="+")
  333. {
  334. kolejka.usun_wierzcholek();
  335. b=Stos.wierzcholek_stosu()->wartosc;
  336. Stos.usun_wierzcholek();
  337. a=Stos.wierzcholek_stosu()->wartosc;
  338. Stos.usun_wierzcholek();
  339. wynik=a+b;
  340. Stos.dodaj_element(wynik);
  341. }
  342. else if(kolejka.piersza_wartosc()->wartosc=="-")
  343. {
  344. kolejka.usun_wierzcholek();
  345. b=Stos.wierzcholek_stosu()->wartosc;
  346. Stos.usun_wierzcholek();
  347. a=Stos.wierzcholek_stosu()->wartosc;
  348. Stos.usun_wierzcholek();
  349. wynik=a-b;
  350. Stos.dodaj_element(wynik);
  351. }
  352. else if(kolejka.piersza_wartosc()->wartosc=="/")
  353. {
  354. kolejka.usun_wierzcholek();
  355. b=Stos.wierzcholek_stosu()->wartosc;
  356. Stos.usun_wierzcholek();
  357. a=Stos.wierzcholek_stosu()->wartosc;
  358. Stos.usun_wierzcholek();
  359. wynik=a/b;
  360. Stos.dodaj_element(wynik);
  361. }
  362. else if(kolejka.piersza_wartosc()->wartosc=="*")
  363. {
  364. kolejka.usun_wierzcholek();
  365. b=Stos.wierzcholek_stosu()->wartosc;
  366. Stos.usun_wierzcholek();
  367. a=Stos.wierzcholek_stosu()->wartosc;
  368. Stos.usun_wierzcholek();
  369. wynik=a*b;
  370. Stos.dodaj_element(wynik);
  371. }
  372. }
  373.  
  374. int Wynik_INT=Stos.wierzcholek_stosu()->wartosc;
  375. cout<<Wynik_INT;
  376. cout<<endl;
  377. }
  378.  
  379. int main()
  380. {
  381. ios_base::sync_with_stdio(false);
  382. int n;
  383. string dzialanie;
  384. Kolejka<string> kolejka;
  385. cin>>n;
  386. int i=0;
  387. while(i<n)
  388. {
  389. cin>>dzialanie;
  390. if(odwrocona_notacja_polska(dzialanie,kolejka))
  391. {
  392. oblicz(kolejka);
  393. }
  394. i++;
  395. }
  396. return 0;
  397. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement