VasilM

queue_stack_with_pointers

Nov 17th, 2013
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.60 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. // дефиниция на указател към обект с параметри:
  6. // числова променлива, указател към следващ обект.
  7. typedef struct Element *pointerToObject;
  8.  
  9. // дефиниране на глобални (за по лесно :)) променливи:
  10. // 2 указателя и една числова променлива за входните данни
  11. pointerToObject sObject, sBuffer;
  12. int userInput;
  13.  
  14. // създаване на структората
  15. struct Element{
  16.     int data;
  17.     pointerToObject next;
  18. };
  19.  
  20. //итеративна функция за добавяне на елемент към стека
  21. void iterativeAdd(){
  22.     while( cin>>userInput ){ // докато има вход
  23.         // при въвеждане на 11 се прекратява добавянето на пореден елемент
  24.         if(userInput == 11) return;
  25.         sBuffer = new Element;
  26.         sBuffer->data = userInput;
  27.         sBuffer->next = sObject;
  28.         sObject = sBuffer;
  29.     }
  30. }
  31.  
  32. //итеративна функция извеждане на елементите в стека
  33. //на конзолата. Работи се само с буферната променлива,
  34. //като се започва от последната въведена променлива (FIFO)
  35. void iterativePrint(){
  36.     sBuffer = sObject;
  37.     while (sBuffer != NULL){
  38.         cout << sBuffer->data << " ";
  39.         sBuffer = sBuffer->next;       
  40.     }
  41. }
  42.  
  43. //функция за принтиране чрез рекурсия
  44. void recursivePrint(pointerToObject obj){
  45.     if (obj == NULL){
  46.         cout << endl;
  47.         return;
  48.     }
  49.     //в зависимост от това, къде ше сложим разпечатването,
  50.     //елеметите биват достъпвани и разпечатвани в различен ред
  51.     cout << obj->data << " "; // тук печата като стек (FIFO)
  52.     recursivePrint(obj->next);
  53.     cout << obj->data << " "; // тук като опашка (LIFO)
  54. }
  55.  
  56. // Функция за рекурсивно добавяне на елементи.
  57. // !!! ТЯ РЕАЛИЗИРА ОПАШКА, А НЕ СТЕК. УКАЗАТЕЛЯT
  58. // sObject ОСТАВА ДА СОЧИ КЪМ ПЪРВИЯТ ДОБАВЕН ОБЕКТ.
  59. // При нея не се налага ползване на допълнителен буфер.
  60. void recursiveAdd(pointerToObject obj){
  61.     cin >> userInput;
  62.     if(userInput == 11){
  63.         obj->data = 999999999;
  64.         return;
  65.     }
  66.     obj->data = userInput;
  67.     obj->next = new Element;
  68.     recursiveAdd(obj->next);
  69. }
  70.  
  71. int main(){
  72.     setlocale(0,"");
  73.     //създаваме си нов елемент от основният обект
  74.     sObject = new Element;
  75.     //и го зануляваме (необходимо за проверката за край на принтирането)
  76.     sObject = NULL;
  77.     //
  78.     cout << "Моля въведете числа в стека:\n";
  79.     cout << "(използвайте '11' за край на въвеждането)\n";
  80.     iterativeAdd();
  81.     /* За да мога да пусна следващата функция recursiveAdd()
  82.     * трябва да променя 2те условия при разпечатващите функции
  83.     * (obj->data != 999999999) и (obj->data == 999999999)
  84.     * както и да закоментирам sObject = NULL;
  85.     */
  86. //  recursiveAdd(sObject);
  87.     cout << "Разпечатване чрез итерация\n";
  88.     iterativePrint();
  89.     cout << "\nРазпечатване чрез рекурсия\n";
  90.     recursivePrint(sObject);
  91.     cout << endl;
  92.     return EXIT_SUCCESS;
  93. }
Advertisement
Add Comment
Please, Sign In to add comment