Advertisement
Guest User

Untitled

a guest
Nov 20th, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.07 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <sstream>
  4. #include <cstdlib>
  5. using namespace std;
  6. struct licz {
  7. string infix;
  8. int wynik;
  9. int nawiasy;
  10. };
  11. class lista {
  12. public:
  13. typedef licz wartosc;
  14. private:
  15. struct element{
  16. wartosc wart;
  17. element * nastepny, * poprzedni;
  18. };
  19. public:
  20. typedef element* pozycja;
  21. private:
  22. pozycja pierwszy, ostatni;
  23. public:
  24. lista();
  25. ~lista();
  26. bool empty();
  27. wartosc front();
  28. wartosc back();
  29. void push_front(wartosc);
  30. void push_back(wartosc);
  31. void pop_front();
  32. void pop_back();
  33. void wypisz();
  34. void erase(pozycja e);
  35. };
  36. lista::lista(){
  37. pierwszy=ostatni=NULL;
  38. }
  39. lista ::~lista (){
  40. pozycja pom;
  41. while(pierwszy!=NULL)
  42. {
  43. pom=pierwszy;
  44. pierwszy=pierwszy->nastepny;
  45. delete pom;
  46. }
  47. }
  48. bool lista :: empty (){
  49. if (pierwszy==NULL)
  50. return true;
  51. else
  52. return false;
  53. }
  54. lista:: wartosc lista::front(){
  55. return pierwszy->wart;
  56. }
  57. lista:: wartosc lista::back (){
  58. return ostatni->wart;
  59. }
  60. void lista::push_front(lista::wartosc w){
  61. pozycja pom=new element;
  62. pom->wart=w;
  63. pom->poprzedni=NULL;
  64. pom->nastepny=pierwszy;
  65. pierwszy=pom;
  66. if(pom->nastepny!=NULL) pom->nastepny->poprzedni=pom;
  67. else ostatni=pom;
  68. }
  69. void lista::push_back(lista::wartosc w){
  70. pozycja pom=new element;
  71. pom->wart=w;
  72. pom->nastepny=NULL;
  73. pom->poprzedni=ostatni;
  74. ostatni=pom;
  75. if(pom->poprzedni!=NULL) pom->poprzedni->nastepny=pom;
  76. else pierwszy=pom;
  77. }
  78. void lista::pop_front(){
  79. pozycja pom=pierwszy;
  80. if(pom!=NULL){
  81. pierwszy=pierwszy->nastepny;
  82. if(pierwszy==NULL)
  83. ostatni=NULL;
  84. else
  85. pierwszy->poprzedni=NULL;
  86. delete pom;
  87. }
  88. }
  89. void lista::pop_back(){
  90. pozycja pom=ostatni;
  91. if(pom!=NULL){
  92. ostatni=ostatni->poprzedni;
  93. if(ostatni==NULL)
  94. pierwszy=NULL;
  95. else
  96. ostatni->nastepny=NULL;
  97. delete pom;
  98. }
  99. }
  100. class stos
  101. {
  102.  
  103. private:
  104. struct liczba{
  105. int wart;
  106. liczba *next;
  107. };
  108. public:
  109. typedef liczba* pozycja;
  110. private:
  111. pozycja root=NULL;
  112. public:
  113. void push(int a)
  114. {
  115. pozycja pom=new liczba;
  116. pom->wart=a;
  117. pom->next=root;
  118. root=pom;
  119.  
  120. }
  121. void pop()
  122. {
  123. if(root)
  124. {
  125. pozycja pom=root;
  126. root=root->next;
  127. delete pom;
  128. }
  129. }
  130. int front()
  131. {
  132. return root->wart;
  133. }
  134. };
  135. class stosString
  136. {
  137.  
  138. private:
  139. struct liczba{
  140. string wart;
  141. int waga;
  142. liczba *next;
  143. };
  144. public:
  145. typedef liczba* pozycja;
  146. private:
  147. pozycja root=NULL;
  148. public:
  149. void push(string a, int w)
  150. {
  151. pozycja pom=new liczba;
  152. pom->wart=a;
  153. pom->waga=w;
  154. pom->next=root;
  155. root=pom;
  156.  
  157. }
  158. void pop()
  159. {
  160. if(root)
  161. {
  162. pozycja pom=root;
  163. root=root->next;
  164. delete pom;
  165. }
  166. }
  167. string front()
  168. {
  169. return root->wart;
  170. }
  171. int frontwaga()
  172. {
  173. return root->waga;
  174. }
  175. int pior()
  176. {
  177. if(root->wart=="+" || root->wart=="-")
  178. return 1;
  179. if(root->wart=="/" || root->wart=="*")
  180. return 2;
  181. else
  182. return 3;
  183. }
  184. };
  185.  
  186. licz posttoinfix(string napis)
  187. {
  188. istringstream iss(napis);
  189. string pom, pom1, pom2;
  190. int waga1,waga2, nawiasy=0;
  191. string infix="";
  192. stosString liczby;
  193. licz wyniki;
  194. while(iss >> pom)
  195. {
  196. if(pom!="+"&& pom!="-" && pom!="*" && pom!="/")
  197. liczby.push(pom,3);
  198. if(pom=="+")
  199. {
  200. pom1=liczby.front();
  201. liczby.pop();
  202. pom2=liczby.front();
  203. liczby.pop();
  204. infix=pom2+pom+pom1;
  205. liczby.push(infix,1);
  206. }
  207. if(pom=="-")
  208. {
  209. pom1=liczby.front();
  210. waga1=liczby.frontwaga();
  211. liczby.pop();
  212. pom2=liczby.front();
  213. waga2=liczby.frontwaga();
  214. liczby.pop();
  215. if(waga1==1)
  216. {
  217. pom1="("+pom1+")";
  218. nawiasy++;
  219. }
  220. infix=pom2+pom+pom1;
  221. liczby.push(infix,1);
  222. }
  223. if(pom=="*")
  224. {
  225. pom1=liczby.front();
  226. waga1=liczby.frontwaga();
  227. liczby.pop();
  228. pom2=liczby.front();
  229. waga2=liczby.frontwaga();
  230. liczby.pop();
  231. if(waga1==1)
  232. {
  233. pom1="("+pom1+")";
  234. nawiasy++;
  235. }
  236. if(waga2==1)
  237. {
  238. pom2="("+pom2+")";
  239. nawiasy++;
  240. }
  241. infix=pom2+pom+pom1;
  242. liczby.push(infix,2);
  243. }
  244. if(pom=="/")
  245. {
  246. pom1=liczby.front();
  247. waga1=liczby.frontwaga();
  248. liczby.pop();
  249. pom2=liczby.front();
  250. waga2=liczby.frontwaga();
  251. liczby.pop();
  252. if(waga1<=2)
  253. {
  254. pom1="("+pom1+")";
  255. nawiasy++;
  256. }
  257. if(waga2<2)
  258. {
  259. pom2="("+pom2+")";
  260. nawiasy++;
  261. }
  262. infix=pom2+pom+pom1;
  263. liczby.push(infix,2);
  264. }
  265.  
  266. }
  267. wyniki.infix=liczby.front();
  268. wyniki.nawiasy=nawiasy;
  269. return wyniki;
  270. }
  271. int zamiana(string a)
  272. {
  273. string pom;
  274. stos liczby;
  275. int cyfra,d,b;
  276. istringstream iss(a);
  277. while(iss >> pom)
  278. {
  279. if(pom!="+" && pom!="/" && pom!="*" && pom!="-")
  280. {
  281. cyfra=atoi(pom.c_str());
  282. liczby.push(cyfra);
  283. }
  284. else{
  285. switch(pom[0])
  286. {
  287. case '*':
  288. d=liczby.front();
  289. liczby.pop();
  290. b=liczby.front();
  291. liczby.pop();
  292. liczby.push(d*b);
  293. break;
  294. case '/':
  295. d=liczby.front();
  296. liczby.pop();
  297. b=liczby.front();
  298. liczby.pop();
  299. liczby.push(d/b);
  300. break;
  301. case '+':
  302. d=liczby.front();
  303. liczby.pop();
  304. b=liczby.front();
  305. liczby.pop();
  306. liczby.push(d+b);
  307. break;
  308. case '-':
  309. d=liczby.front();
  310. liczby.pop();
  311. b=liczby.front();
  312. liczby.pop();
  313. liczby.push(b-d);
  314. break;
  315. }
  316. }
  317. }
  318.  
  319. return liczby.front();
  320. }
  321. int main()
  322. {
  323. int K,wynik,wyniki[4], index=0, ile=0;
  324. string napis;
  325. licz liczby;
  326. cin>>K;
  327. int wyniki[K];
  328. licz infix[K];
  329. char znak[1];
  330. for(int i=0;i<K;i++)
  331. {
  332. cin>>znak;
  333. if(znak[0]=='D')
  334. {
  335. cin.ignore();
  336. getline(cin,napis);
  337. wyniki[i]=zamiana(napis);
  338. infix[i]=posttoinfix(napis);
  339.  
  340. }
  341. if(znak[0]=='S')
  342. {
  343. cin>>wynik;
  344. for(int i=0;i<K;i++)
  345. {
  346. if(wyniki[i]==wynik)
  347. ile++;
  348. }
  349. index=[i];
  350. }
  351. }
  352.  
  353.  
  354. return 0;
  355. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement