Advertisement
Guest User

Untitled

a guest
Feb 24th, 2020
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.10 KB | None | 0 0
  1. #pragma once
  2. #include<iostream>
  3. #include<string>
  4. using namespace std;
  5. template <class ATOM>
  6. struct NOD {
  7.  
  8. ATOM data;
  9. NOD *succ;
  10. };
  11. using namespace std;
  12. template<class ATOM>
  13. NOD<ATOM> *addNod(ATOM val)
  14. {
  15. NOD<ATOM> *x = 0;
  16. x = new NOD<ATOM>;
  17. x->data = val;
  18. x->succ = 0;
  19. return x;
  20. }
  21. template <typename ATOM>
  22. void PUSH(NOD<ATOM> *&stack, ATOM val)
  23. {
  24. NOD<ATOM> *p = 0;
  25. if (isEmpty <ATOM>(stack))
  26. {
  27. stack = addNod <ATOM>(val);
  28. }
  29. else
  30. {
  31. p = addNod <ATOM>(val);
  32. p->succ = stack;
  33. stack = p;
  34. }
  35. }
  36. template <typename ATOM>
  37. void initStack(NOD<ATOM> *&stack)
  38. {
  39. stack = NULL;
  40. }
  41. template <typename ATOM>
  42. bool isEmpty(NOD<ATOM> *&stack)
  43. {
  44. return(stack == NULL);
  45. }
  46. template <typename ATOM>
  47. bool POP(NOD<ATOM> *&stack, ATOM &val)
  48. {
  49. NOD<ATOM> *p = stack;
  50. if (!isEmpty <ATOM>(stack))
  51. {
  52. val = p->data;
  53. stack = stack->succ;
  54. delete p;
  55. return 1;
  56. }
  57. return 0;
  58. }
  59. template <typename ATOM>
  60. bool top(NOD<ATOM> *&stack, ATOM &val)
  61. {
  62. if (!isEmpty <ATOM>(stack))
  63. {
  64. val = stack->data;
  65. return 1;
  66. }
  67. return 0;
  68. }
  69. template <typename ATOM>
  70. void afisare(NOD<ATOM> *stack)
  71. {
  72. NOD<ATOM> *p = stack;
  73. cout << "Stiva mea este:";
  74. while (stack)
  75. {
  76. cout << p->data << " ";
  77. p = p->succ;
  78. }
  79. }
  80. template <typename ATOM>
  81. ATOM topv(NOD<ATOM> *stack)
  82. {
  83. ATOM val;
  84. if (!isEmpty<ATOM>(stack))
  85. {
  86. val = stack->data;
  87. return val;
  88. }
  89. return NULL;
  90. }
  91. template<typename ATOM>
  92. string fp(string str)
  93. {
  94.  
  95. string out;
  96. NOD<ATOM> * stack;
  97. initStack<ATOM>(stack);
  98. PUSH(stack, '#');
  99. for (int i = 0;i < str.size();++i)
  100. {
  101. if (str[i] == '(')
  102. {
  103. PUSH<ATOM>(stack, '(');
  104. }
  105. else
  106. if (isdigit(str[i]))
  107. {
  108. out += str[i];
  109. }
  110. else
  111. if (str[i] == ')')
  112. {
  113. while (topv<ATOM>(stack) != '(')
  114. {
  115. ATOM val;
  116. int temp = POP<ATOM>(stack, val);
  117. if (temp)
  118. out += val;
  119. }
  120. ATOM rez;
  121. bool temp = POP<ATOM>(stack, rez);
  122. }
  123. else
  124. {
  125. while (!isEmpty<ATOM>(stack) && prior(str[i]) <= priorStack(topv(stack)) && (stack->data != '#') && (stack->data != '('))
  126. {
  127. ATOM val;
  128. val = topv<ATOM>(stack);
  129. if (prior(val) <= priorStack(topv<ATOM>(stack)))
  130. {
  131.  
  132. int temp = POP<ATOM>(stack, val);
  133. if (temp)
  134. out += val;
  135.  
  136. }
  137.  
  138. }
  139. PUSH<ATOM>(stack, str[i]);
  140. }
  141. }
  142. while (topv<ATOM>(stack) != '#')
  143. {
  144. ATOM val;
  145. int temp = POP<ATOM>(stack, val);
  146. if (temp)
  147. out += val;
  148. }
  149. return out;
  150. }
  151.  
  152. string digits()
  153. {
  154. string x;
  155. char cnt;
  156.  
  157. do
  158. {
  159. cin >> cnt;
  160. if (cnt != '0')
  161. {
  162. x += cnt;
  163. }
  164. } while (cnt != '0');
  165. return x;
  166. }
  167. int prior(char c)
  168. {
  169. if (c == '(')
  170. return 3;
  171. if ((c == '*') || (c == '/'))
  172. return 2;
  173. if ((c == '+') && (c == '-'))
  174. return 1;
  175. return -1;
  176. }
  177. int priorStack(char c)
  178. {
  179. if (c == '(')
  180. return 0;
  181. if ((c == '*') || (c == '/'))
  182. return 2;
  183. if ((c == '+') && (c == '-'))
  184. return 1;
  185. return -1;
  186. }
  187. template<typename ATOM>
  188. double calcul(string out)
  189. {
  190. NOD<ATOM> * stack;
  191. ATOM ret;
  192. initStack<ATOM>(stack);
  193. PUSH<ATOM>(stack, 0);
  194. for (int i = 0;i < out.size();++i)
  195. {
  196. if (isdigit(out[i]))
  197. {
  198. int ia = (out[i] - '0') % 48;
  199. PUSH<ATOM>(stack, (ATOM)ia);
  200. }
  201. else
  202. {
  203. ATOM a, b;
  204. if (!isEmpty<ATOM>(stack) && topv<ATOM>(stack) != 0)
  205. {
  206. bool temp;
  207. temp = POP<ATOM>(stack, a);
  208. temp = POP<ATOM>(stack, b);
  209. if (out[i] == '+')
  210. {
  211. ATOM aux = b + a;
  212. PUSH<ATOM>(stack, aux);
  213. }
  214. if (out[i] == '-')
  215. {
  216. ATOM aux = b - a;
  217. PUSH<ATOM>(stack, aux);
  218. }
  219. if (out[i] == '*')
  220. {
  221. ATOM aux= b * a;
  222. PUSH<ATOM>(stack, aux);
  223. }
  224. if (out[i] == '/')
  225. {
  226. ATOM aux = b / a;
  227. PUSH<ATOM>(stack, aux);
  228. }
  229.  
  230. }
  231. }
  232. }
  233.  
  234. if (!isEmpty<ATOM>(stack) && (topv<ATOM>(stack) != '#'))
  235. {
  236. bool k = POP<ATOM>(stack, ret);
  237. }
  238. return ret;
  239. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement