2013-05-18 4 views
0

Есть 3 стеки - А, В, ССортировка двух стеков с использованием структур

Стеки А и В сортируются (номер на вершине стека является самым большим). Стек С Empty только 5 операции допускаются:

толчок, поп, сверху, IS_EMPTY, создать

Нам нужно написать функцию, которая принимает стеки A и B, перемещает все числа в стеки A и B в стек C и стек C должны быть отсортированы (наибольшее число находится сверху).

У меня есть алгоритм:

Compare top of A with top of B

Pop the least element and push to stack C 

Repeat step 2 until any of the stack (A or B) becomes empty 

Move remaining elements from non-empty stack to C. Now you have all the elements in C but in ascending order. (That is least element at top). 

Move all the elements from C to A. (Contents in A are in descending order) 

Move all the elements from A to B. (Contents in B are in ascending order) 

Move all the elements from B to C. 

и я начал писать код, но есть ошибки, и я не знаю, почему!

код:

#include <stdio.h> 
#include <stdlib.h> 
#include <conio.h> 
#define MAX_MEMBERS 10 
typedef struct 
{ 
    int num; 
}ITEM; 

typedef struct 
{ 
    ITEM a[MAX_MEMBERS]; 
    int top; 
}STACK; 

void create_stack(STACK *s) 
{ 
    s->top=-1; 
} 

int is_empty(STACK *s) 
{ 
    return s->top==-1; 
} 

int is_full(STACK *s) 
{ 
    return s->top==MAX_MEMBERS-1; 
} 

ITEM pop(STACK *s) 
{ 
    return s->a[s->top--]; 
} 

void (STACK *s,ITEM *item) 
{ 
    s->a[++s->top]=*item; 
} 

ITEM top(STACK *s) 
{ 
    return s->a[s->top]; 
} 

void sort (STACK *a,STACK *b,STACK *c) 
{ 
    while(!is_empty(&a)||!is_empty(&b)) 
     if(top(&a)>top(&b)) 
      push(&c,pop(&b)); 

    if(!is_empty(&a)) 
    { 
     while(!is_empty(&a)) 
      push(&c,pop(&a)); 
    } 

    else 
    { 
     while(!is_empty(&b)) 
      push(&c,pop(&b)); 
    } 

    while(!is_empty(&c)) 
     push(&a,pop(&c)); 

    while(!is_empty(&a)) 
     push(&b,pop(&a)); 

    while(!is_empty(&b)) 
     push(&c,pop(&b)); 

} 

void main(void) 
{ 
    STACK a,b,c; 
    create_stack(&a); 
    create_stack(&b); 
    create_stack(&c); 
    sort(&a,&b,&c); 
} 

ответ

0

Вы должны совать самый высокий элемент и толкать его к С.

Чтобы подтолкнуть все элементы на C в обратном порядке вам нужен высокий элемент в нижней части С (это значение должно быть нажато первым). Если a> b Затем: pop a, нажмите c.

В любом случае, ваш код не выглядит очень безопасным. Посмотрите на следующее:

while(!is_empty(&a)||!is_empty(&b)) 
    if(top(&a)>top(&b)) 

давайте предположим, что пусто и б не так, что a.top равен -1 и b.top находится в диапазоне от 0 до MAX_MEMBERS - 1. Так как один из стеки не пусты, условие истинно. По телефону top (& a) выполняется следующий код:

возвращение a [-1]; // Ошибка: индекс за пределами

This is how your code is resolved. 
is_empty(&a) returns true 
!is_empty(&a) returns false 
(false || true) returns true 

while(false || true) 
    if(top(&a) > top(&b)) 

В любом случае, я сомневаюсь, что ваш код даже скомпилирован.

void (STACK *s,ITEM *item) 
{ 
    s->a[++s->top]=*item; 
} 

Это должно быть что:

void push(STACK *s,ITEM *item) 
{ 
    s->a[++s->top]=*item; 
} 

считают также, что:

void main(void) 
{ 
    STACK a,b,c; 
    create_stack(&a); //stack a is created, contains no elements 
    create_stack(&b); //stack b is created, contains no elements 
    create_stack(&c); //stack c is created, contains no elements 
    sort(&a,&b,&c); //sort which elements of the stack? 
} 
+0

Но где вы видите, что я назвал "сверху (& а)", если мы предположим, что "А" пусто ? –

+0

Я ответил на ваш вопрос через редактирование – Machtl

+0

Извините, можете ли вы изменить код, потому что я не получаю его. Может ли вставить код и скомпилировать код без каких-либо ошибок? –

Смежные вопросы