Advertisement
Guest User

Untitled

a guest
Dec 17th, 2018
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.23 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define DEFAULT_STACK_SIZE (10)
  5.  
  6. typedef int data_t;
  7. #define DATA_MASK "%d"
  8. /* Этот код не слишком уникалный, и признаюсь от части стырен но теперь он максимально добрый понял? */
  9.  
  10. typedef struct TWO_WAY_STACK {
  11.     data_t * pData;
  12.     data_t * pHead;
  13.     data_t * pTail;
  14.     size_t nSize;
  15. } twstack_t;
  16.  
  17. twstack_t * twstack_new(size_t size) {
  18.     twstack_t * stk = malloc(sizeof(twstack_t));
  19.     if ( ! stk )
  20.         return NULL;
  21.    
  22.     if ( ! ( stk->pData = malloc(sizeof(data_t) * size) ) ) {
  23.         free(stk);
  24.         return NULL;
  25.     }
  26.    
  27.     stk->nSize = size;
  28.     stk->pHead = stk->pData - 1;
  29.     stk->pTail = stk->pData + stk->nSize;
  30.    
  31.     return stk;
  32. }
  33.  
  34. int twstack_push_head(twstack_t * stk, const data_t data) {
  35.     if ( stk->pHead + 1 >= stk->pTail )
  36.         return -1;
  37.    
  38.     *(++(stk->pHead)) = data;
  39.    
  40.     return 0;
  41. }
  42.  
  43. int twstack_pop_head(twstack_t * stk, data_t * dataHolder) {
  44.     if ( stk->pHead < stk->pData )
  45.         return -1;
  46.    
  47.     *dataHolder = *(stk->pHead--);
  48.    
  49.     return 0;
  50. }
  51.  
  52. int twstack_push_tail(twstack_t * stk, const data_t data) {
  53.     if ( stk->pTail - 1 <= stk->pHead )
  54.         return -1;
  55.    
  56.     *(--(stk->pTail)) = data;
  57.    
  58.     return 0;
  59. }
  60.  
  61. int twstack_pop_tail(twstack_t * stk, data_t * dataHolder) {
  62.     if ( stk->pTail >= stk->pData + stk->nSize )
  63.         return -1;
  64.    
  65.     *dataHolder = *(stk->pTail++);
  66.    
  67.     return 0;
  68. }
  69.  
  70. void twstack_free(twstack_t * stk) {
  71.     free(stk->pData);
  72.     free(stk);
  73. }
  74.  
  75. void flush_input(void) {
  76.     char ch;
  77.    
  78.     while ( scanf("%c", &ch) == 1 && ch != '\n' )
  79.         ;
  80. }
  81.  
  82. int main(void) {
  83.     twstack_t * stk;
  84.     data_t data;
  85.     int choose;
  86.    
  87.     if ( ! ( stk = twstack_new(DEFAULT_STACK_SIZE) ) ) {
  88.         fprintf(stderr, "Ошибка памяти!\n");
  89.         return 1;
  90.     }
  91.    
  92.     while ( printf("[1 = Помощь]> ") > 0 && scanf("%d", &choose) == 1 && choose ) {
  93.         switch ( choose ) {
  94.             case 1:
  95.                 printf("0 = Выйти\n"
  96.                        "1 = Помощь\n"
  97.                        "2 = Внести с начала\n"
  98.                        "3 = Снять с начала\n"
  99.                        "4 = Внести с конца\n"
  100.                        "5 = Снять с конца\n\n"
  101.                 );
  102.                 break;
  103.             case 2:
  104.                 printf("Значение: ");
  105.                 if ( scanf(DATA_MASK, &data) != 1 ) {
  106.                     flush_input();
  107.                     printf("ПРАВИЛЬНО ВВЕДИ АЛО!\n");
  108.                 }
  109.                 else if ( twstack_push_head(stk, data) )
  110.                     printf("Стак Переполнен!\n");
  111.                 else
  112.                     printf("Все ништяк, бро, задачу выполнил.\n");
  113.                 break;
  114.             case 3:
  115.                 if ( twstack_pop_head(stk, &data) )
  116.                     printf("Начало пустое, поэтому для начала введи его, понял?!\n");
  117.                 else
  118.                     printf("Вот твое значение: " DATA_MASK "\n", data);
  119.                 break;
  120.             case 4:
  121.                 printf("Значение: ");
  122.                 if ( scanf(DATA_MASK, &data) != 1 ) {
  123.                     flush_input();
  124.                     printf("ПРАВИЛЬНО ВВЕДИ АЛО!\n");
  125.                 }
  126.                 else if ( twstack_push_tail(stk, data) )
  127.                     printf("Стак переполнен!\n");
  128.                 else
  129.                     printf("OK.\n");
  130.                 break;
  131.             case 5:
  132.                 if ( twstack_pop_tail(stk, &data) )
  133.                     printf("Братишка, у тебя сзади пусто, поэтому сначала заполни значения!\n");
  134.                 else
  135.                     printf("Вот твое значение: " DATA_MASK "\n", data);
  136.                 break;
  137.             default:
  138.                 printf("ЧЕ?!\n");
  139.                 break;
  140.         }
  141.     }
  142.    
  143.     twstack_free(stk);
  144.     return 0;
  145. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement