【问题标题】:How to push elements in a stack using C如何使用 C 将元素压入堆栈
【发布时间】:2020-02-24 09:14:59
【问题描述】:

我尝试在 C 中学习堆栈。但无法执行推送操作,因为它显示了一些错误。控制台中没有显示错误消息。但是在运行代码时,执行peek方法时显示错误的top值。

#include<stdio.h>
#include<stdlib.h>
#define MAX 50
typedef enum{FALSE,TRUE} boolean;
typedef struct stack{
    int top;
    int a[MAX];
 }stack;
void CreateStack(stack s){
    s.top = -1;
 }
 boolean isEmpty(stack s){
    return (s.top == -1);
}
boolean isFull(stack s){
    return(s.top == MAX - 1);
}
void push(stack s, int data){
    if(isFull(s)){
        printf("Stack is Full\n");
        exit(1);
    }
    else{
        s.top = s.top + 1;
        s.a[s.top] = data;
    }
 }
 void pop(stack s){
    if(isEmpty(s)){
        printf("Stack is Empty");
        exit(1);
    }
    else{
        printf("%d\n",s.a[s.top]);
        s.top = s.top - 1;
    }
 }
 int peek(stack s){
    return s.a[s.top];
 }
 void main(){
    stack s;
    CreateStack(s);
    int num;
    push(s,1);
    push(s,2);
    push(s,15);
    printf("Top value = %d\n",peek(s));
 }

【问题讨论】:

  • 如果您需要帮助调试您的代码,可能让我们查看您的代码会很方便 :-)
  • “因为它显示了一些错误。”显示。代码。错误。你的想法。制作minimal reproducible example。提供引起问题的样本数据。详细解释上述错误的表现方式。在这里直接显示所有内容,作为文本而不是图片。逐字引用错误和输出。
  • 我不得不承认,起初我很想发表不同的评论。在我顶住了诱惑,转而提供了一些指导意见后,请允许我开玩笑地写下以下内容来发泄情绪。它会让这里的一些人微笑,从而使他们心情更愉快。一旦您edited 提出您的问题以提供所需的信息,这将对您有利。 “你的问题是由数据的第二部分引起的。在你的代码的第 10 行。你知道,你在哪里对另一件事做那件事。那不能那样工作。换个方式——你知道的。”
  • 一口井。我错了,不是第 10 行,而是第 9 行(我可能希望某处有一个空行以提高可读性)。您在哪里将参数移交给该函数作为按值调用。以另一种方式进行,通过引用调用。在所有其他功能中也是如此。
  • 对于那些试图在这里开玩笑的人:我的感情发泄评论是在代码可见之前,它是完全正确的,只是为了我预测的行号中的一个错误。对不起,但我觉得这很有趣。 (啊,好吧,关于第二部分数据的部分不是重点......)

标签: c stack


【解决方案1】:

问题是您没有修改作为参数传递的结构。每个函数都有一个本地副本,该副本在函数结束时不再存在。这是pushmain 函数的示例。对所有函数进行相同的更改。

void push(stack *s, int data){
    if(isFull(s)){
        printf("Stack is Full\n");
        exit(1);
    }
    else{
        s->top = s->top + 1;
        s->a[s->top] = data;
    }
 }

void main(){
    stack s;
    CreateStack(&s);
    push(&s,1);
    push(&s,2);
    push(&s,15);
    printf("Top value = %d\n",peek(&s));
}

您可以避免使用 isEmptyisFullpeek 的指针,因为它们不会修改任何内容。但我认为最简单的方法是为所有人使用相同的界面。为了安全起见,您可以将它们声明为bool isFull(stack const *s)

【讨论】:

    猜你喜欢
    • 2019-02-23
    • 2013-12-26
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 2015-01-03
    • 1970-01-01
    相关资源
    最近更新 更多