Как скопировать стопку из оригинальной стопки - PullRequest
1 голос
/ 30 октября 2019

Я попытался написать программу переменного тока, которая будет иметь функцию, которая возвращает дублирующийся стек данного стека. Стек дубликатов содержит те же элементы, что и исходный стек, и в том же порядке. Оригинальный стек должен остаться без изменений. Но я не получил желаемого результата. Последние два вывода printf () не отображаются при запуске кода. Код заканчивается в конце команды printf (), которая показывает пиковый элемент стека ввода.

void DuplicateStack(stack *s, stack *s1){
    int n;
    stack s3;
    CreateStack(&s3);
    while(!isEmpty(s)){
        n = pop(&s);
        push(&s3,n);
    }
    while(!isEmpty(&s3)){
        n = pop(&s3);
        push(&s,n);
        push(&s1,n);
    }
 }
  void main(){
     stack s,s1;
     CreateStack(&s);
    CreateStack(&s1);
    int num,n;
    printf("Enter no.of numbers you want to enter: ");
    scanf("%d",&num);
    for(int i=0; i<num; i++){
        scanf("%d",&n);
        push(&s,n);
    }
    printf("Top element: %d\n",peek(&s));
    DuplicateStack(&s,&s1);
    printf("Top Element in the Original Stack: %d\n",peek(&s));
    printf("Top Element in the Duplicate Stack: %d\n",peek(&s1));
 }

Ответы [ 2 ]

4 голосов
/ 30 октября 2019

Кажется, что прототип push/pop выглядит следующим образом.

void push (stack *, int);
void pop (stack *);

В этом случае у вас неопределенное поведение.

    n = pop(&s);
    push(&s,n);
    push(&s1,n);

Вышеуказанные вызовы в функции DuplicateStack на самом делепередача функции stack ** в push/pop вместо stack *. Поскольку s и s1 уже stack *, &s и &s1 дают вам stack **.

Попробуйте изменить их на.

void DuplicateStack(stack *s, stack *s1){
    int n;
    stack s3;
    CreateStack(&s3);
    while(!isEmpty(s)){
        n = pop(s);  // <<<-- &s to s
        push(&s3,n);
    }
    while(!isEmpty(&s3)){
        n = pop(&s3);
        push(s,n);   // <<<--- &s to s
        push(s1,n);  // <<<----&s1 to s1
    }
 }
0 голосов
/ 31 октября 2019
`void binary(stack *s, int num){
    int n;
    while(num != 0){
        if(!isFull(s)){
            n = num % 2;
            push(s,n);
            num = num / 2;
        }
        else{
            exit(1);
        }
    }
}

@ kiran Это еще один код, который я сделал, чтобы преобразовать десятичное число в двоичное число и сохранить его в стеке. Этот код также решает ту же проблему и также заканчивается в этой позиции. Ниже приведен минимальный код исходной задачи, которую я задал.

  while(!isEmpty(s)){
        n = pop(&s);
        c1 = c1 + 1;
        if(n%2 != 0)
            push(&s1,n);
    }
    while(!isEmpty(s1)){
        n = pop(&s1);
        push(&s,n);
        c2 = c2 + 1;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...