C 在堆栈程序中引用数组索引位置时使用双指针
我有一个使用单指针完成的堆栈程序。现在我必须使用double类型的双指针将索引引用到double类型数组中的元素。我做了一个随机数发生器,我试图满足这4个条件 堆栈将是一个双精度数组的形式。 push的第三个参数和pop的第二个参数的形式是 double**top,即指向存储堆栈上当前顶层元素地址的指针的指针。提示:在这些函数中,在堆栈更新时修改*top。 将为您创建一个全局整数变量myerror。其值可以是STACK_FULL、STACK_EMPTY和NORMAL。在push和pop函数中使用此变量,以通知主函数操作的状态。 在main中测试您的函数。请参见skeleton code stack.c中的详细信息。 我不知道如何将双指针传递给push函数。那是双字C 在堆栈程序中引用数组索引位置时使用双指针,c,C,我有一个使用单指针完成的堆栈程序。现在我必须使用double类型的双指针将索引引用到double类型数组中的元素。我做了一个随机数发生器,我试图满足这4个条件 堆栈将是一个双精度数组的形式。 push的第三个参数和pop的第二个参数的形式是 double**top,即指向存储堆栈上当前顶层元素地址的指针的指针。提示:在这些函数中,在堆栈更新时修改*top。 将为您创建一个全局整数变量myerror。其值可以是STACK_FULL、STACK_EMPTY和NORMAL。在push和pop函数中使用
#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,并表示堆栈为空。