我有一个任务要求我用随机变量填充堆栈并在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;
}
答案 0 :(得分:6)
你的推动应该是
(*top)++;
stack[*top] = value;
这是第一个递增到下一个空位置然后插入。 top
变量始终指向顶部元素。因此,推,先增加然后分配。要弹出,首先在顶部提取值然后递减。
注意:上面一行可以加入stack[++(*top)] = value
在当前代码中,在首次推送时,带有stack[*top++] = item
的代码,后增量尝试将值分配给当前值*top
,这是-1
然后递增,这是错误的。
关于推送例程的这种修改,pop例程是可以的。
答案 1 :(得分:0)
我会混合两个答案(一个刚刚删除):
您必须同时修复push
和pop
void push(char stack[],char item,int *top,int max_size){
stack[++(*top)] = item;
}
char pop(char stack[],int *top){
return stack[(*top)--];
}
现在会给出预期的结果
答案 2 :(得分:0)
Postfix ++
和--
的优先级高于一元*
,因此为了增加top
指向的内容,需要写(*top)++
和(*top)--
; *top++
将推进指针,这不是你想要的。
其次,堆栈指针应始终指向添加到堆栈的最后一个东西,因此您希望在写入堆栈之前递增堆栈指针:
stack[++(*top)] = value;
前缀++
与一元*
具有相同的优先级,因此在这种情况下,括号不是绝对必要的;这些操作是从左到右应用的,因此++*top
被解释为++(*top)
,但是parens有助于使事情变得清晰。
推送和弹出应始终是彼此相反的;如果您使用++(*top)
进行推送,则需要弹出(*top)--
。