Advertisement
Jakubowiczish

Untitled

Mar 14th, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.88 KB | None | 0 0
  1. #include <iostream>
  2. #include <ctime>
  3. #include <cstdlib>
  4. /*
  5. 1. Implementacja kolejko priorytetowej na drzewie trinarnym
  6. 2. wyra¿enie arytmetyczne sk³ada siê: ze zmiennych a,b,c,...
  7. operatorów +,-,*,/,^ oraz nawiasów (). Proszê zaimplementowaæ
  8. funkcjê sprawdzaj¹c¹ poprawnoœæ wyra¿enie.
  9. 3. Jak zaimplementowaæ kolejkê na dwóch stosach?
  10. 4. Proszê zaimplementowaæ algorytm “przesuwaj¹cy” zadan¹ n-elementow¹
  11. tablicê A o k pozycji.
  12. (Przesuniêcie tablicy oznacza, ¿e element, który by³ pierwotnie na
  13. pozycji i, powinien siê znaleŸæ na pozycjê
  14. n + k (modulo n). Algorytm powinien dzia³aæ w miejscu.
  15. */
  16. using namespace std;
  17.  
  18. const int MAX=20;
  19.  
  20. struct stos {
  21. int t[MAX];
  22. int size;
  23. };
  24.  
  25. int parent(int index);
  26. int leftChild(int index);
  27. int middleChild(int index);
  28. int rightChild(int index);
  29. void heapify(int arr[], int index);
  30. void buildHeap(int arr[], int n);
  31. int heapsort(int arr[], int n);
  32.  
  33. int ExtractMax(int tab[]);
  34. void Insert(int tab[], int N, int key);
  35. void printPriorityQueue(int tab[]);
  36.  
  37. bool isExpressionValid(string expression);
  38. char operators[5]={'+','-','*','/','^'};
  39.  
  40. void moveElements_helping(int tab[], int N, int k,int index);
  41. void moveElements_actual(int tab[], int N, int k);
  42. int count_next(int i, int N, int k);
  43. void set_table(int tab[], int N);
  44. void print_table(int tab[], int N);
  45.  
  46. void init(stos &st);
  47. void push(stos &st, int el);
  48. int pop(stos &st);
  49. bool empty(stos &st);
  50. int put(stos &s1, int value);
  51. int get(stos &s1, stos &s2);
  52.  
  53. ///***********************************MAIN*********************************///
  54. int main()
  55. {
  56. cout << "TASK NUMBER 1: " << endl << endl;
  57. ///*********************ZADANIE 1*******************************///
  58. srand(time(NULL));
  59. //EXAMPLE USAGE OF ALGORITHM
  60. int n = 5;
  61. int arr[n];
  62. arr[0] = 0; //in this place, a size of elements will be stored
  63.  
  64. for(int i = 0; i < n-1; i++){
  65. int prority = rand();
  66. cout << "Inserting prority: " << prority << endl;
  67. Insert(arr,n,prority);
  68. printPriorityQueue(arr);
  69. }
  70. for(int i = 0; i < n-1; i++){
  71. int extracted = ExtractMax(arr);
  72. cout << "Extracting: " << extracted << endl;
  73. printPriorityQueue(arr);
  74. }
  75.  
  76. cout << "TASK NUMBER 2: " << endl << endl;
  77. ///********************** ZADANIE 2 ****************************///
  78. string expression;
  79. cout << "Enter the expression: " << endl;
  80. getline(cin,expression);
  81. if(isExpressionValid(expression))
  82. cout << "The expression is valid" << endl;
  83. else
  84. cout << "The expression is faulty!" << endl;
  85.  
  86. cout << "TASK NUMBER 3: " << endl << endl;
  87. ///******************** ZADANIE 3 **********************///
  88. stos s1;
  89. stos s2;
  90.  
  91. init(s1);
  92. init(s2);
  93.  
  94. put(s1,3);
  95. put(s1,8);
  96. put(s1,2);
  97. put(s1,4);
  98.  
  99. cout << get(s1,s2) << endl;
  100. cout << get(s1,s2) << endl;
  101. cout << get(s1,s2) << endl;
  102. cout << get(s1,s2) << endl;
  103.  
  104. cout << endl << endl;
  105.  
  106. cout << "TASK NUMBER 4: " << endl << endl;
  107. ///************************ZADANIE 4******************************///
  108.  
  109. int N = 20;
  110. int tab[N];
  111. set_table(tab,N);
  112. print_table(tab,N);
  113. int k;
  114. cout << "How many to the right? " << endl;
  115. cin >> k;
  116. moveElements_actual(tab,N,k);
  117. print_table(tab,N);
  118. return 0;
  119. }
  120.  
  121. ///***********************************************************************************************///
  122.  
  123. int ExtractMax(int tab[])
  124. {
  125. if(tab[0] == 0)
  126. exit(1);
  127. int result = tab[1];
  128. tab[1] = tab[tab[0]];
  129. tab[tab[0]] = 0;
  130. tab[0]--;
  131. heapify(tab,1);
  132. return result;
  133. }
  134.  
  135. void Insert(int tab[], int N, int key)
  136. {
  137. if(tab[0] == N-1)
  138. exit(1); /// queue is full
  139. tab[++tab[0]] = key;
  140. int i = tab[0];
  141.  
  142. while(i > 1 and tab[i] > tab[parent(i)]){
  143. swap(tab[i],tab[parent(i)]);
  144. i = parent(i);
  145. }
  146. }
  147.  
  148. void printPriorityQueue(int tab[])
  149. {
  150. cout << "Priority Queue: " << endl;
  151. for(int i = 1; i <= tab[0]; i++){
  152. cout << tab[i] <<" ";
  153. }
  154. cout << endl;
  155. }
  156.  
  157. int parent(int index)
  158. {
  159. if(index%3 == 2) return index/3 + 1;
  160. if(index%3 == 0) return index/3;
  161. if(index%3 == 1) return index/3;
  162. }
  163. int leftChild(int index)
  164. {
  165. return index*3-1;
  166. }
  167. int middleChild(int index)
  168. {
  169. return index*3;
  170. }
  171. int rightChild(int index)
  172. {
  173. return index*3+1;
  174. }
  175. void heapify(int arr[], int index)
  176. {
  177. int size = arr[0];
  178. int largest = index;
  179. int left = leftChild(index);
  180. int middle = middleChild(index);
  181. int right = rightChild(index);
  182. if(left <= size && arr[left] > arr[largest]) largest=left;
  183. if(middle <= size && arr[middle] > arr[largest]) largest=middle;
  184. if(right <= size && arr[right] > arr[largest]) largest=right;
  185. if(largest != index){
  186. std::swap(arr[largest], arr[index]);
  187. heapify(arr,largest);
  188. }
  189. }
  190. void buildHeap(int arr[], int n)
  191. {
  192. arr[0]=n-1;
  193. for(int i = (n-1)/3; i>=1; i--){
  194. heapify(arr,i);
  195. }
  196. }
  197. int heapsort(int arr[], int n)
  198. {
  199. buildHeap(arr, n);
  200. for(int i = n-1; i>1; i--){
  201. std::swap(arr[1], arr[i]);
  202. arr[0]--;
  203. heapify(arr,1);
  204. }
  205. }
  206.  
  207. void init(stos &st)
  208. {
  209. st.size=0;
  210. }
  211. void push(stos &st, int el)
  212. {
  213. st.t[st.size++]=el;
  214. } // brak kontroli
  215. int pop(stos &st)
  216. {
  217. return st.t[--st.size];
  218. } // brak kontroli
  219. bool empty(stos &st)
  220. {
  221. return (st.size==0);
  222. }
  223. int put(stos &s1, int value)
  224. {
  225. push(s1,value);
  226. }
  227. int get(stos &s1, stos &s2)
  228. {
  229. while(s1.size > 1){
  230. int value = pop(s1);
  231. push(s2, value);
  232. }
  233. int tmp = pop(s1);
  234. while(s2.size > 0){
  235. int value = pop(s2);
  236. push(s1, value);
  237. }
  238. return tmp;
  239. }
  240.  
  241. bool isExpressionValid(string expression)
  242. {
  243. int bracketsCounter = 0;
  244. int charactersCounter=0;
  245. int operatorsCounter=0;
  246. bool lastOperator=false;
  247. bool lastCharacter=false;
  248. for(int i = 0; i < expression.size(); i++){
  249. if(expression[i]=='('){
  250. lastOperator=false;
  251. lastCharacter=false;
  252. bracketsCounter++;
  253. }
  254. if(expression[i]==')'){
  255. bracketsCounter--;
  256. lastOperator=false;
  257. lastCharacter=false;
  258. if(lastOperator) return false;
  259. if(bracketsCounter < 0) return false;
  260. }
  261. if((expression[i]>='A' && expression[i] <= 'Z') || (expression[i]>='a' && expression[i] <= 'z')){
  262. if(!lastCharacter){
  263. charactersCounter++;
  264. lastCharacter=true;
  265. lastOperator=false;
  266. }
  267. }
  268. for(int j = 0; j < 5; j++){
  269. if(expression[i]==operators[j]){
  270. operatorsCounter++;
  271. if(lastOperator){
  272. return false;
  273. }
  274. lastCharacter=false;
  275. lastOperator=true;
  276. }
  277. }
  278. }
  279. cout << "Liczba operatorow: " << operatorsCounter << endl;
  280. cout << "Liczba zmiennych: " << charactersCounter << endl;
  281. if(bracketsCounter!=0) return false;
  282. if(lastOperator) return false;
  283. return true;
  284. }
  285.  
  286. void moveElements_helping(int tab[], int N, int k,int index)
  287. {
  288. int start = index;
  289. int current = tab[index];
  290. int next = count_next(index,N,k);
  291. while(next != start){
  292. swap(current,tab[next]);
  293. index = next;
  294. next = count_next(index,N,k);
  295. }
  296. swap(current,tab[next]);
  297. }
  298.  
  299. void moveElements_actual(int tab[], int N, int k)
  300. {
  301. int it = (N%k == 0) ? k : 1;
  302. for(int i = 0; i < it; i++)
  303. moveElements_helping(tab,N,k,i);
  304. }
  305.  
  306. int count_next(int i, int N, int k)
  307. {
  308. return (i+k)%N;
  309. }
  310. void set_table(int tab[], int N)
  311. {
  312. for(int i = 0; i < N; ++i) {
  313. tab[i] = i+2;
  314. }
  315. }
  316.  
  317. void print_table(int tab[], int N)
  318. {
  319. for(int i =0 ; i < N; ++i) {
  320. cout << tab[i] << " ";
  321. }
  322. cout << endl;
  323. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement