我怎样才能正确地用C编写栈的实现?

f45qwnt8  于 2023-01-01  发布在  其他
关注(0)|答案(1)|浏览(144)

我正在尝试使用数组实现堆栈,以下是我目前为止的代码:

include <stdio.h>
int stack[100], top, n = 3;
void push();
void pop();
void show();

void main(){
    top = -1;
    int ch;
    printf("1 = push, 2 = pop, 3 = display, 4 = exit \n");
    printf("Enter a number: ");
    scanf("%d", &ch);
    do {
        switch(ch){
            case 1:
            push();
            break;
            
            case 2:
            pop();
            break;
            
            case 3:
            show();
            break;
            
            case 4:
            printf("Exited the stack");
            break;
            
            default:
            printf("Non existant number");
            break;
            
            
        }
    } while (ch != 4);
}

void push(){
    int value;
    if (top > n){
        printf("Stack Overflow");
    } else {
        printf("Add number to stack: ");
        scanf("%d", value);
        top++;
        stack[top] = value;
    
    }
}
void pop(){
    if (top < 0){
        printf("Stack Underflow");
    } else {
        top--;
    }
}
void show(){
    int i;
    for (i = top; i >= 0; i--){
        printf("%d", stack[i]);
    }
}

但是,当我运行这段代码并输入1(即push一个值到堆栈中)时,我的代码并没有在添加值后中断进程,而是不断地要求添加新值,直到发生堆栈溢出。
我认为在switch中调用push之后添加break语句会中断函数并要求再次输入新数字,但在我当前的程序中,它不会这样做。
我应该在代码中更改什么?

wqlqzqxt

wqlqzqxt1#

尝试下面的代码,

include <stdio.h>
int stack[100], top, n = 3;
void push();
void pop();
void show();

void main(){
    top = -1;
    int ch;
    printf("1 = push, 2 = pop, 3 = display, 4 = exit \n");
    printf("Enter a number: ");
    scanf("%d", &ch);
    do {
        switch(ch){
            case 1:
            push();
            break;
            
            case 2:
            pop();
            break;
            
            case 3:
            show();
            break;
            
            case 4:
            printf("Exited the stack");
            break;
            
            default:
            printf("Non existant number");
            break;
            
        }
        
        printf("Enter a number: ");
        scanf("%d", &ch);
        
        
    } while (ch != 4);
}

void push(){
    int value;
    if (top == n){
        printf("Stack Overflow");
    } else {
        printf("Add number to stack: ");
        scanf("%d", &value);
        top++;
        stack[top] = value;
    
    }
}
void pop(){
    if (top < 0){
        printf("Stack Underflow");
    } else {
        top--;
    }
}
void show(){
    int i;
    for (i = top; i >= 0; i--){
        printf("%d", stack[i]);
    }
}

这里我已经改变了你的代码中的一些部分。首先我在switch语句之后添加了scanf,以便从用户端获取数字。然后我改变了push函数中的scanf("%d", &value);。因为在你的代码中没有将值的地址传递给scanf。因此值保持未初始化。最后,如果push函数内的条件更改为检查top值是否等于n

相关问题