C 在堆栈程序中引用数组索引位置时使用双指针

C 在堆栈程序中引用数组索引位置时使用双指针,c,C,我有一个使用单指针完成的堆栈程序。现在我必须使用double类型的双指针将索引引用到double类型数组中的元素。我做了一个随机数发生器,我试图满足这4个条件 堆栈将是一个双精度数组的形式。 push的第三个参数和pop的第二个参数的形式是 double**top,即指向存储堆栈上当前顶层元素地址的指针的指针。提示:在这些函数中,在堆栈更新时修改*top。 将为您创建一个全局整数变量myerror。其值可以是STACK_FULL、STACK_EMPTY和NORMAL。在push和pop函数中使用

我有一个使用单指针完成的堆栈程序。现在我必须使用double类型的双指针将索引引用到double类型数组中的元素。我做了一个随机数发生器,我试图满足这4个条件

堆栈将是一个双精度数组的形式。 push的第三个参数和pop的第二个参数的形式是 double**top,即指向存储堆栈上当前顶层元素地址的指针的指针。提示:在这些函数中,在堆栈更新时修改*top。 将为您创建一个全局整数变量myerror。其值可以是STACK_FULL、STACK_EMPTY和NORMAL。在push和pop函数中使用此变量,以通知主函数操作的状态。 在main中测试您的函数。请参见skeleton code stack.c中的详细信息。 我不知道如何将双指针传递给push函数。那是双字

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>

#define STACK_SIZE  10

#define STACK_FULL      -2
#define STACK_EMPTY     -1
#define NORMAL          0

int myerror = NORMAL;

void push(double [],    // input/ouput - the stack
          double,   // input - data being pushed onto the stack
          double **,    // input/output - pointer to pointer to the top of stack
          int);     // constant - maximum capacity of stack

double          // output - data being popped out from the stack
pop(double [],  // input/output - the stack
    double **); // input/output - pointer to pointer to top of stack

void push(double stack[], double item, double **top, int max_size)
{
    if(**top==(max_size-1))
    {
        printf("Stack is Full\n");
        return;
    }
    else
    {
    }
    return;

}

double pop(double stack[],
           double **top){     
}

int main(){
    double s[STACK_SIZE];
    double *s_top = NULL;
    int max_size=STACK_SIZE;
    double **top;
    top=&s_top;

    srand(time(NULL));

    int i;
    double randNum=0.0;

    for(i=0; i<STACK_SIZE; i++)
    {
        randNum = 94.0*(rand()/(RAND_MAX + 1.0));
        randNum = randNum + 33.0;
        printf("\nRandom double : %f\n ",randNum);
        //      push(s, randNum, top, max_size);
    }
    printf("-----------\n");


    // Keep pushing doubles equivalent to chars randomly picked between '!'(33) and '~'(126)
    // to the stack until it is full.
    // Print each double before each pushing.

    // Keep popping out doubles from the stack until it is empty
    // Print each double after each popping.

    // Repeat above until the user says 'no'.      

    return 0;
}

调用push时,传递堆栈顶部指针的地址。看起来s_top是指向堆栈顶部的指针,因此在调用push时,您应该使用:

push(s,          /* the entire stack */
     randNum,    /* the number being added to the stack */
     &s_top,     /* pass the ADDRESS of the pointer which points to the top-of-stack */
     max_size);  /* the maximum size of the stack - could also just pass STACK_SIZE */
+关于这个问题,因为这是一个在家庭作业问题上寻求帮助的好方法。你不是在要求解决整个问题,只是在你不明白的事情上寻求帮助

分享和享受。

示例代码

void push(double stack[], double item, double **top, int max_size){
    if(*top == stack + max_size){
        printf("Stack is Full\n");
        myerror = STACK_FULL;
        return;
    }
    **top = item;
    ++*top;
    myerror = NORMAL;
}

int main(){
    double s[STACK_SIZE];
    double *s_top = s;
    double randNum=0.0;

    srand(time(NULL));

    while(myerror != STACK_FULL){
        randNum = 94.0*(rand()/(RAND_MAX + 1.0));
        randNum = randNum + 33.0;
        printf("\nRandom double : %f\n ",randNum);
        push(s, randNum, &s_top, STACK_SIZE);
        //printf("%p, <%f>\n", (void*)s_top, s_top[-1]);
    }
    printf("-----------\n");
    return 0;
}

您使用的短语double pointer可能令人困惑。该术语有时指指向某种类型**的指针,有时指指向double double*的指针。我看到了,我的意思是,它是一个double类型指针的指针,正确的术语应该是指向double类型指针的指针。指针不能是double类型;它可以是double*或double**,或者……我看到,在我的机器上,每个double是8个字节,因此在我的push函数中,我有一个if-else语句,检查它是否已满,在not部分,我有以下内容:stack[**top]=item;这会抛出一个错误,表示数组下标不是整数,不知道如何将堆栈顶部的双指针绑定到我的数组索引。这是我应该做的吗?指针不是下标。如果使用声明为double*的s_top作为指向要存储内容的位置的指针,则应*s_top=item;-换句话说,将item的值存储到s_top指向的位置。您可以使用double**top(指向堆栈顶部的指针)来更改堆栈顶部指针-如*top=&stack[n]-换句话说,将堆栈第n个元素的地址存储到top指向的double*中。我希望这能有所帮助。再看一次-在您的示例堆栈[**top]=item;,作为**top提供的下标是一个double-**top,在本例中是指由top指向的指针指向的double变量的值。我明白了,我正试图从中构建pop函数,如果*top stack>-1{value=**top;-*top;myerror=NORMAL;[/code],我有[code]if*top stack>-1{value=**top;-*top;myerror=NORMAL但是,这会跳过最后一个推送的项目,弹出第二个项目,然后在最后一个元素中弹出0.000,并表示堆栈为空。