使用双打数组推送和弹出

时间:2013-09-18 22:49:10

标签: c arrays

我有一个任务要求我用随机变量填充堆栈并在FILO命令中弹出它们。虽然我设法让它只使用int类型工作,但似乎现在我需要更改它以实现一个双精度数组,它将使用double类型填充数组中的字符并从中弹出双精度数堆叠直到它为空并打印它们。我尝试过只更改两个函数中的类型,但不断出错,我不知道为什么。这就是我到目前为止所拥有的。任何帮助都将受到赞赏。

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

#define STACK_SIZE  10

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

int myerror = NORMAL;

void push(double [],
          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)
{
    stack[++(**top)] = item;
}

double pop(double stack[],
           double **top)
{
    return stack[(**top)--];
    return 0.0;
}

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

    srand(time(NULL));
    char randChar = ' ';
    double i = 0;
    double j=0;
    double randNum = 0;

    for (i = 0; i < STACK_SIZE; i++){
        randNum = 33 + (double)(rand() % ((126-33)+ 1 ));
        randChar = (double) randNum;
        push(s,randChar, &(*s_top), STACK_SIZE);

        printf ("Random characters: %c\n", randChar);}

    printf("-----------\n");

    for(j=STACK_SIZE; j>0; j--){
        printf("Random characters: %c\n", pop(s, & *s_top));
    }

    return 0;
}

这些是错误btw

  

stack.c:在函数'push'中:stack.c:28:错误:数组下标不是   整数stack.c:在函数'pop'中:stack.c:35:error:array   下标不是整数stack.c:在函数'main'中:stack.c:42:   警告:初始化使得指针来自整数而没有强制转换   stack.c:53:警告:从不兼容的传递'push'的参数3   指针类型stack.c:60:警告:传递'pop'的参数2   不兼容的指针类型stack.c:60:警告:格式'%c'需要   输入'int',但参数2的类型为'double'stack.c:60:warning:   格式'%c'需要类型'int',但参数2的类型为'double'

基本上这是我在使用类型整数之前所拥有的并且它正在工作,现在他给出了指令,并希望我们将其更改为double类型,我试图合并它们无济于事。

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

#define STACK_SIZE 10
#define STACK_EMPTY -1

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

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

void push(char stack[],
          char item,
          int *top,
          int max_size){

    stack[++(*top)] = item;

}

char pop(char stack[],
         int *top){


    return stack[(*top)--];

    // Return STACK_EMPTY if the stack is empty.

    return STACK_EMPTY;
}

int main(){
    char s[STACK_SIZE];
    int s_top = STACK_EMPTY; // Pointer points to the index of the top of the stack

    srand(time(NULL));

    char randChar = ' ';
    int i = 0;
    int j=0;
    int randNum = 0;

    for (i = 0; i < STACK_SIZE; i++){
        randNum = 33 + (int)(rand() % ((126-33)+ 1 ));
        randChar = (char) randNum;
        push(s,randChar, &s_top, STACK_SIZE);

        printf ("Random characters: %c\n", randChar);}

    printf("-----------\n");

    for(j=STACK_SIZE; j>0; j--){
        printf("Random characters: %c\n", pop(s, &s_top));
    }


    return 0;
}

好的,所以这就是他要求我们做的,生病编辑而不是对每个人做长篇评论,我认为这会更容易

“你之前在堆栈上实现了推送和弹出操作,在这里,你被要求再次执行,但是有4个主要更改,如下所述:

  • 堆栈将采用双打数组的形式。
  • push()的第三个参数和pop()的第二个参数将会发生 以双**顶部的形式,即。指向存储堆栈中当前顶部元素地址的指针。

  • 为您创建全局整数变量myerror。它的值可以是STACK_FULL,STACK_EMPTY和NORMAL。在push()和pop()函数中使用此变量,以通知main()函数操作的状态。 “

2 个答案:

答案 0 :(得分:3)

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

#define STACK_SIZE 10

typedef struct
{
    double items[STACK_SIZE];
    double* next;
} Stack;

void init(Stack* s)
{
    s->next = s->items;
}

void push(Stack* s, double val)
{
    if (s->next >= s->items + STACK_SIZE)
       fprintf(stderr, "stack overflow\n");
    else
    {
        *s->next++ = val;
        printf("push %g\n", val);
    }
}

void pop(Stack* s)
{
    if (s->next == s->items)
       fprintf(stderr, "stack underflow\n");
    else
        printf("pop %g\n", *--s->next);
}

int main(void)
{
    Stack s;
    init(&s);

    srand(time(NULL));

    for (int i = 0; i < STACK_SIZE; i++)
        push(&s, (double)rand());

    printf("-----------\n");

    for (int i = 0; i < STACK_SIZE; i++)
        pop(&s);

    return 0;
}     

答案 1 :(得分:2)

我非常有信心这与本作业的内容类似。注意使用by-address指针参数(即指向指针的指针)来记住堆栈顶部的位置。第一次使用它们时,双指针有点令人生畏,老实说,这是一个非常糟糕的例子,说明应该如何使用它们。

请注意,对于ptr-to-ptr,阵列库的唯一实际用途是测试已有多少元素的限制。正如我所说,有点无意义。

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

#define STACK_SIZE  10

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

int push(double stack[], double value, double **top, int sizemax)
{
    if (*top - stack < sizemax)
    {
        **top = value;
        ++*top;
        return NORMAL;
    }
    return STACK_FULL;
}

int pop(double stack[], double **top, double *result)
{
    if (*top - stack > 0)
    {
        --*top;
        *result = **top;
        return NORMAL;
    }
    return STACK_EMPTY;
}


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

    srand((unsigned)time(NULL));

    for (i = 0; i < STACK_SIZE; i++)
    {
        randNum = 33 + (double)(rand() % ((126-33)+ 1 ));
        printf("Random value: %f\n", randNum);
        push(s, randNum, &s_top, STACK_SIZE);
    }

    printf("-----------\n");

    while (pop(s, &s_top, &randNum) != STACK_EMPTY)
        printf("Random value: %f\n", randNum);

    return 0;
}

这样做非常容易出错,因为您可以为堆栈顶部传递任何您喜欢的值,即使是从未使用s[]的基址进行初始化的内容。使用int偏移(当然是地址)比使用双指针更好 。因此,我之所以说它之所以不适合这项任务。


关于您发布的代码。我可以撕掉它,但很明显你对指针算法或ptr-to-ptr情况不太满意(特别是在他们认为不合适的作业中,我想)。然而,有些事情值得注意。

  1. 任何时候你看到自己这样做:&(*(var))你知道有些事情是对的。它是不正确的,不会编译。有趣的是,相反的顺序并非未定义,而是毫无意义:*(&(var))相当于var

  2. 所有这些函数都应该返回状态或值。请注意我对弹出的更改。此外,通常对于堆栈,队列,列表等具有empty()top()等函数。正确的返回值允许我按照定义的方式编写最终while-loop。上面的代码。

  3. 请注意您的printf()说明符。当你用“double”文本替换所有“char”时,你永远不会改变你的(无论如何都不会起作用),因此发送doubleprintf(),它期望一个整数类型。它不会崩溃,但它肯定也不会是正确的输出。 (如果你犯了相反的错误,将{{1>}发送给char说明符, 可能会崩溃。

  4. 不要全局替换数据类型并期望您的代码只是编译。很少这么简单(正如你所发现的那样)。

  5. 根据此处发布的代码判断,请查看%f类似问题的实施情况。

  6. 希望它有所帮助。