Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #define DEFAULT_STACK_SIZE (10)
- typedef int data_t;
- #define DATA_MASK "%d"
- /* Этот код не слишком уникалный, и признаюсь от части стырен но теперь он максимально добрый понял? */
- typedef struct TWO_WAY_STACK {
- data_t * pData;
- data_t * pHead;
- data_t * pTail;
- size_t nSize;
- } twstack_t;
- twstack_t * twstack_new(size_t size) {
- twstack_t * stk = malloc(sizeof(twstack_t));
- if ( ! stk )
- return NULL;
- if ( ! ( stk->pData = malloc(sizeof(data_t) * size) ) ) {
- free(stk);
- return NULL;
- }
- stk->nSize = size;
- stk->pHead = stk->pData - 1;
- stk->pTail = stk->pData + stk->nSize;
- return stk;
- }
- int twstack_push_head(twstack_t * stk, const data_t data) {
- if ( stk->pHead + 1 >= stk->pTail )
- return -1;
- *(++(stk->pHead)) = data;
- return 0;
- }
- int twstack_pop_head(twstack_t * stk, data_t * dataHolder) {
- if ( stk->pHead < stk->pData )
- return -1;
- *dataHolder = *(stk->pHead--);
- return 0;
- }
- int twstack_push_tail(twstack_t * stk, const data_t data) {
- if ( stk->pTail - 1 <= stk->pHead )
- return -1;
- *(--(stk->pTail)) = data;
- return 0;
- }
- int twstack_pop_tail(twstack_t * stk, data_t * dataHolder) {
- if ( stk->pTail >= stk->pData + stk->nSize )
- return -1;
- *dataHolder = *(stk->pTail++);
- return 0;
- }
- void twstack_free(twstack_t * stk) {
- free(stk->pData);
- free(stk);
- }
- void flush_input(void) {
- char ch;
- while ( scanf("%c", &ch) == 1 && ch != '\n' )
- ;
- }
- int main(void) {
- twstack_t * stk;
- data_t data;
- int choose;
- if ( ! ( stk = twstack_new(DEFAULT_STACK_SIZE) ) ) {
- fprintf(stderr, "Ошибка памяти!\n");
- return 1;
- }
- while ( printf("[1 = Помощь]> ") > 0 && scanf("%d", &choose) == 1 && choose ) {
- switch ( choose ) {
- case 1:
- printf("0 = Выйти\n"
- "1 = Помощь\n"
- "2 = Внести с начала\n"
- "3 = Снять с начала\n"
- "4 = Внести с конца\n"
- "5 = Снять с конца\n\n"
- );
- break;
- case 2:
- printf("Значение: ");
- if ( scanf(DATA_MASK, &data) != 1 ) {
- flush_input();
- printf("ПРАВИЛЬНО ВВЕДИ АЛО!\n");
- }
- else if ( twstack_push_head(stk, data) )
- printf("Стак Переполнен!\n");
- else
- printf("Все ништяк, бро, задачу выполнил.\n");
- break;
- case 3:
- if ( twstack_pop_head(stk, &data) )
- printf("Начало пустое, поэтому для начала введи его, понял?!\n");
- else
- printf("Вот твое значение: " DATA_MASK "\n", data);
- break;
- case 4:
- printf("Значение: ");
- if ( scanf(DATA_MASK, &data) != 1 ) {
- flush_input();
- printf("ПРАВИЛЬНО ВВЕДИ АЛО!\n");
- }
- else if ( twstack_push_tail(stk, data) )
- printf("Стак переполнен!\n");
- else
- printf("OK.\n");
- break;
- case 5:
- if ( twstack_pop_tail(stk, &data) )
- printf("Братишка, у тебя сзади пусто, поэтому сначала заполни значения!\n");
- else
- printf("Вот твое значение: " DATA_MASK "\n", data);
- break;
- default:
- printf("ЧЕ?!\n");
- break;
- }
- }
- twstack_free(stk);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement