7

我有一个任务要求我用随机变量填充堆栈并以 FILO 顺序弹出它们。虽然我设法让它填满堆栈,但它似乎弹出了最后一个元素,没有别的了。我不确定为什么。任何帮助,将不胜感激。

#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--];
}
int main(){
    char s[STACK_SIZE];
    int s_top = STACK_EMPTY; // Pointer points to the index of the top of the stack

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

    srand(time(NULL));

    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 char: %c\n", randChar);

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

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

3 回答 3

6

你的推动应该是

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

那是首先递增到下一个空位置,然后插入。该top变量始终指向顶部元素。因此,要推送,首先递增然后分配。要弹出,首先提取顶部的值,然后递减。

注意:上面的线可以用棍棒打到stack[++(*top)] = value

在当前代码中,在第一次 push时,您的代码使用stack[*top++] = item, 后递增尝试将值分配给当前值*topis-1然后递增,这是错误的。

关于推送例程的这种修改,弹出例程是可以的。

于 2013-09-12T05:27:55.187 回答
0

我将混合两个答案(一个刚刚被删除):

你必须同时修复pushpop

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

    stack[++(*top)] = item;
}
char pop(char stack[],int *top){

    return stack[(*top)--];
}

现在将给出预期的结果

仅查看推送更新推送和弹出都更新

于 2013-09-12T05:34:24.857 回答
0

后缀++and--比一元具有更高的优先级*,所以为了增加top 指向的东西,你需要写(*top)++and (*top)--; *top++将推进指针,这不是你想要的。

其次,堆栈指针应始终指向添加到堆栈中的最后一个东西,因此您希望在写入堆栈之前增加堆栈指针:

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

Prefix++与 unary 具有相同的优先级*,因此在这种情况下,括号不是绝对必要的;操作从左到右应用,因此++*top被解释为++(*top),但括号有助于使事情变得清晰。

Push 和 pop 应该永远是相反的;如果你用 推++(*top),你需要用 弹出(*top)--

于 2013-09-12T06:04:28.467 回答