Реализуйте стек, используя указатель на указатель - PullRequest
1 голос
/ 14 марта 2019

Я реализую небольшую программу для упражнений с двойными указателями. Это основная программа:

#include <stdio.h>
#include "serial.h"
#include "stack.h"

int main(void) {
    serial_init();  

    /* Array to hold stack entries */
    int stack[10]={0};
    /* Stack pointer */
    int *stack_p = stack;

    /* Code to call the functions */

    push(&stack_p, 1); 
    push(&stack_p, 2); 
    push(&stack_p, 3); 
    push(&stack_p, 4); 

    printf("popped value: %d\r\n", pop(&stack_p));
    printf("popped value: %d\r\n", pop(&stack_p));
    printf("popped value: %d\r\n", pop(&stack_p));
    printf("popped value: %d\r\n", pop(&stack_p));
}        

void push(int **sp, int value) {
    /*  Implement it */ 
}

int pop(int **sp) {
    /*  Implement it */ 
}

Я реализовал функцию push, кажется, все в порядке.Однако поп возвращается только последний элемент, а затем 10

void push(int **sp, int value) {
/* implemented it*/

 int *pt; 
 pt=&value; // Store the value to the pointer 

 printf("Push value is is %d\r\n", *pt);
 sp = &pt; // associate the pointer to the pointer of pointer
 ++(*pt);   
}

int pop(int **sp) {
 /* implemented it */
 int value;
 int *pt;
 pt=&value;

 sp = &pt;
 *pt--;

 return value;
}   

1 Ответ

6 голосов
/ 14 марта 2019

Ваши функции push и pop слишком сложны и совершенно неправильны:

Вы хотите это:

void push(int **sp, int value) {
  **sp = value;   // put value onto top of the stack
  (*sp)++;        // increment stack pointer
}

int pop(int **sp) {
  (*sp)--;        // decrement stack pointer
  return **sp;    // return value which is on nthe op of the stack
}

Ваш неправильный код для push с пояснениями в комментариях:

void push(int **sp, int value) {
  int *pt; 
  pt=&value; // here you put the pointer to the local variable value
             // into pt, but local variables disappear as soon
             // as the function has finished

  //  the printf is the only thing one more or less correct
  //  but you could just print directly 'value' like this:
  //    printf("Pushed value is %d\r\n", value);
  //
  printf("Push value is is %d\r\n", *pt);

  sp = &pt;  // this only assigns the pointer to the local variable pt to 
             // the local variable sp

  ++(*pt);   // here you increment actually the local variable
             // value which is pointless 
}

Кстати: инициализация нуля всего стека не требуется, хотя это может помочь в процессе отладки.Таким образом, вы можете написать объявление стека следующим образом:

int stack[10];  // no initialisation necessary

Упражнение для вас:

Объясните точную причину, по которой нет необходимости инициализировать все элементыстека в ноль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...