Создать два стека на одном массиве - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Задание такое: при реализации стека массивом располагать два стека в одном массиве. Один стек располагается в начале массива и растет к концу, а другой располагается в конце массива и растет к началу. Задание я понял не очень, но что-то попытался реализовать, можете объяснить мне задпние подробнее.Вот, до чего додумался
#include <stdio.h>
#include <stdlib.h>
 
#define MAX_SIZE 1
#define MULT 1
#define STACK_OVERFLOW  -100
#define STACK_UNDERFLOW -101
#define OUT_OF_MEMORY   -102
 
typedef struct Stack_tag
{
    int *data;
    int size;
    int top;
}stack_t, stack_d;
 
//------------------------------stack_1-----------------------------
stack_t *creat_stack()
{
    stack_t *out = NULL;
    out = malloc(sizeof(stack_t));
    if(!out)
        exit(OUT_OF_MEMORY);
    out->size = MAX_SIZE;
    out->data = malloc(out->size*sizeof(int));
    if (out->data==NULL)
    {
        free(out);
        exit(OUT_OF_MEMORY);
    }
    out->top = 0;
    return out;
}
 
void delete_stack(stack_t **stack)
{
    free((*stack)->data);
    free(*stack);
    *stack = NULL;
}
 
void resize(stack_t *stack)
{
    stack->size += MULT;
    stack->data = realloc(stack->data,stack->size*sizeof(int));
    if (stack->data == NULL)
        exit(OUT_OF_MEMORY);
}
 
//-----------------------------------------------------------------------------
void push(stack_t *stack, int value)
{
    if (stack->top >= stack->size)
        resize(stack);
    stack->data[stack->top]= value;
    stack->top++;
}
 
void push_1(stack_d *stack, int value)
{
    if (stack->top >= stack->size)
        resize(stack);
    stack->data[stack->top]= value;
    stack->top--;
}
 
int pop(stack_t *stack)
{
    if(stack->top == 0)
        exit(STACK_UNDERFLOW);
    stack->top--;
    return (stack->data[stack->top]);
}
 
void print_stack_value(const int value)
{
    printf("%d", value);
}
 
void print_stack(const stack_t *stack, void(*print_stack_value)(const int))
{
    int len=stack->size-1;
    int i;
    for(i = len; i > 0; i--)
    {
        print_stack_value(stack->data[i]);
        printf(" | ");
    }
    if (stack->size != 0)
    {
        print_stack_value(stack->data[i]);
    }
    printf("\n");
}
 
int main()
{
    stack_t *stack_1 = creat_stack();
    stack_t *stack_2 = creat_stack();
    int a;
 
    printf("Input quantyty items: ");
    scanf("%d",&a);
    push(stack_1, a);
    print_stack(stack_1, print_stack_value);
    printf("Input quantyty items: ");
    scanf("%d",&a);
    push_1(stack_2, a);
    print_stack(stack_2, print_stack_value);
 
    return 0;
}
Вот, переделал, теперь что-то похожее. 2 стека в одном массиве, один растет от начала массива к концу, а другой от конца к началу, только вот когда кладу элементы в первый стек, вроде все нормально. а когда во второй, то ничего не работает, почему?
#include <stdio.h>
#include <stdlib.h>
 
#define MAX_SIZE 10
#define MULT 1
#define STACK_OVERFLOW  -100
#define STACK_UNDERFLOW -101
#define OUT_OF_MEMORY   -102
 
typedef struct Stack_tag
{
    int data[MAX_SIZE];
    int size;
    int top1, top2;
}stack_t;
 
//------------------------------stack_1-----------------------------
 
void push(stack_t *stack, int value)
{
    stack->data[stack->top1]= value;
    stack->top1++;
}
 
void push_1(stack_t *stack, int value)
{
    stack->data[stack->top2]= value;
    stack->top2--;
}
 
int pop(stack_t *stack)
{
    if(stack->top1 == 0)
        exit(STACK_UNDERFLOW);
    stack->top1--;
    return (stack->data[stack->top1]);
}
 
void print_stack_value(const int value)
{
    printf("%d", value);
}
 
void print_stack_1(const stack_t *stack, void(*print_stack_value)(const int))
{
    int len_1 = stack -> top1;
    int i = 0;
    for(i = len_1-1; i >= 0; i--)
    {
        print_stack_value(stack->data[i]);
        printf(" | ");
    }
}
 
void print_stack_2(const stack_t *stack, void(*print_stack_value)(const int))
{
    int len_2 = stack -> top2;
    int j;
 
    for(j = len_2; j >= 0; j--)
    {
        print_stack_value(stack->data[j]);
        printf(" | ");
    }
}
 
int main()
{
    int a;
    stack_t stack_1;
    stack_1.top1 = 0;
    stack_1.top2 = MAX_SIZE;
 
    printf("Input quantyty items: ");
    scanf("%d",&a);
    push(&stack_1, a);
    printf("Input quantyty items: ");
    scanf("%d",&a);
    push(&stack_1, a);
    print_stack_1(&stack_1, print_stack_value);
 
    printf("Input quantyty items: ");
    scanf("%d",&a);
    push_1(&stack_1, a);
    print_stack_2(&stack_1, print_stack_value);
 
    return 0;
}

Решение задачи: «Создать два стека на одном массиве»

textual
Листинг программы
#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, "Memory error!\n");
        return 1;
    }
    
    while ( printf("[1 = help]> ") > 0 && scanf("%d", &choose) == 1 && choose ) {
        switch ( choose ) {
            case 1:
                printf("0 = exit\n"
                       "1 = this help\n"
                       "2 = push head\n"
                       "3 = pop head\n"
                       "4 = push tail\n"
                       "5 = pop tail\n\n"
                );
                break;
            case 2:
                printf("Data: ");
                if ( scanf(DATA_MASK, &data) != 1 ) {
                    flush_input();
                    printf("Wrong input!\n");
                }
                else if ( twstack_push_head(stk, data) )
                    printf("Stack is full!\n");
                else
                    printf("OK.\n");
                break;
            case 3:
                if ( twstack_pop_head(stk, &data) )
                    printf("Head part is empty!\n");
                else
                    printf("Returned value: " DATA_MASK "\n", data);
                break;
            case 4:
                printf("Data: ");
                if ( scanf(DATA_MASK, &data) != 1 ) {
                    flush_input();
                    printf("Wrong input!\n");
                }
                else if ( twstack_push_tail(stk, data) )
                    printf("Stack is full!\n");
                else
                    printf("OK.\n");
                break;
            case 5:
                if ( twstack_pop_tail(stk, &data) )
                    printf("Tail part is empty!\n");
                else
                    printf("Returned value: " DATA_MASK "\n", data);
                break;
            default:
                printf("Unknown selection!\n");
                break;
        }
    }
    
    twstack_free(stk);
    return 0;
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.5 из 5
Похожие ответы