【问题标题】:Difficulties with implementation of stack堆栈实现的困难
【发布时间】:2021-03-21 08:16:30
【问题描述】:

我试图进入结构,但我被卡住了。这里我尝试实现栈的主要功能:

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#define N 10

    struct docEdit 
{
    char text[20];
    int StrNum;
};


struct Stack {
    struct docEdit items[N];
    int top;
};
    
void pushstack(struct Stack* st, struct docEdit myEvent1) {
if (st->top == N - 1) {
    printf("Stack is full");
    return;
    }   
    
    st->items[st->top++] = myEvent1;
}

    void popstack(struct Stack* st) {
    if (st->top == -1) {
        printf("Stack is empty");
        return;
    }
        st->top--;
    }

    int emptystack(struct Stack* st) {
        return st->top = 0;
    }

    int sizestack(struct Stack* st) {
        return st->top;
    }

    (//function data type//) top(struct Stack* st) {
        return st->items[st->top];
    }



    int main() {
    setlocale(LC_ALL, "");
    struct Stack st;
    st.top = -1;
    struct docEdit myEvent1 = {"string 1", 1};

    pushstack(&st, myEvent1);
    popstack(&st);

    return 0;
    }

有两个问题:为什么写st变量没有初始化,top函数应该有什么数据类型?如果您指出我的错误和不准确之处,我也将非常感激。

【问题讨论】:

  • @adislaus01231 “为什么它写的是 st 变量没有初始化” - 你写了代码,你问我们为什么这样写?!
  • 堆栈包含struct docEdits,所以它应该返回一个struct docEdit。根据您计划使用堆栈的方式,返回struct docEdit * 是一个很好的例子。请记住在完成参考之前不要弹出它。
  • 您可以在创建每个结构之前编写 typdef,使用 typedef 可以让您编写 docEdit/Stack 而不必一直编写 struct docEdit/Stack。这不是必需的,这只是一种方便。你不需要使用 typedef 来让你的代码工作。如果您愿意,您可以继续在任何地方编写 struct docEdit 和 structStack
  • 请正确缩进您的代码。这是一种很好的风格,而且它使其他人更容易阅读。

标签: c data-structures struct stack function-definition


【解决方案1】:

函数定义相互矛盾。例如函数popstack

void popstack(struct Stack* st) {
if (st->top == -1) {
    printf("Stack is empty");
    return;
}
    st->top--;
}

表示当 st->top == -1 时堆栈为空。另一方面,函数emptystack(可能有错字,使用赋值运算符=而不是比较运算符==,不清楚该函数是清理堆栈还是报告堆栈是否为空)

int emptystack(struct Stack* st) {
        return st->top = 0;
    }

st-&gt;top等于0时,说明栈为空。

或者函数sizestack

int sizestack(struct Stack* st) {
        return st->top;
    }

表示大小等于值st-&gt;top。很明显,由于声明,堆栈的最大大小等于N

struct docEdit items[N];

然而函数pushstack

void pushstack(struct Stack* st, struct docEdit myEvent1) {
if (st->top == N - 1) {
    printf("Stack is full");
    return;
    }   
    
    st->items[st->top++] = myEvent1;
}

表示当st-&gt;top 等于N - 1 时堆栈已满。

即你应该决定数据成员top的初始值是否必须等于-10,并相应地调整所有函数定义。

至于函数top,那么它应该返回一个指向堆栈元素的指针。

struct docEdit * top( struct Stack* st) {
        if ( st->top != 0 )
        return st->items + st->top - 1;
        else
        return NULL; 
    }

使用返回的指针,您可以更改堆栈顶部元素的值。在这个函数中,我假设当堆栈为空时,st-&gt;top 等于 0。

【讨论】:

    【解决方案2】:

    有两行导致问题。

    第一个在main函数中:

    st.top = -1;
    

    以及pushstack函数中的第二个:

    st->items[st->top++] = myEvent1;
    

    这两行的作用与以下相同:

    st->items[-1] = myEvent1;
    

    -1 是一个无效的数组索引。

    解决方案很简单:使用 pre 增量 ++ 代替:

    st->items[++st->top] = myEvent1;
    

    这将首先将st-&gt;top-1 增加到0,并使用0 作为索引。

    【讨论】:

      猜你喜欢
      • 2020-10-11
      • 1970-01-01
      • 2015-04-24
      • 2013-01-25
      • 2019-11-11
      • 2010-11-27
      • 2013-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多