堆栈实现错误

时间:2016-03-21 02:19:28

标签: c

我正在尝试在这里编写一些堆栈实现代码,并且我已经挂了几个编译错误/寻找关于我所看到的一些问题的一些澄清。

特别是我很难弄清楚我的函数运行的主函数中的输入应该是什么。他们希望指针作为输入,我如何给它们指点?

我的isEmpty()和我的推()不喜欢我的输入。 :(

这是我的代码 -

#include <stdio.h>
#include <conio.h>
#define MAX 100
typedef struct {
int * st; // array of the data on the stack
int size;
int T;
int x;
int a[];
} stack;



void push(stack *st, int item) {
    printf("\nT value%d",st->T);
    st->T++;
    if (st->T >= st->size) {
        printf("\nStack size limit reached, can't push.");
        return;
    }
    st->T++;
    printf("\nT value%d",st->T);
    st->a[st->T]=item;
    printf("\n array value at position T %d", st->a[st->T]);
}

int pop(stack *st) {
    int item;
    printf("\nT value%d", st->T);   
    item=st->a[st->T];
    printf("\n item= %d", item);
    st->T--;
    printf("\nT value%d", st->T);
    return(item);

}

int size(stack *st){
    int size_of_stack=0;
    size_of_stack = st->T + 1; 
    printf ("\n size of stack = %d", size_of_stack);
    return size_of_stack;
}

int isEmpty(stack *st)
{
  if(st->T == -1) 
     return(1);
  else
     return(0);
}

int top(stack *st, stack T){
    int value= st->T;
    return(value);
}

void print(stack *st){
    int i;
    if (isEmpty(*st)==1)
        printf("\n Stack is empty! \n");
    else {
        for (i=st->T; i>= 0 ; i-- )
            printf ("\n%d",st->a[i]);
    }
}

int main(){
    int st[MAX],item;
    int T=-1;
    int a[6]={10,20,30,40,50,60};
    push(* st,2);

}

以下是我为此获得的编译错误。

λ gcc a3.c
a3.c: In function 'print':
a3.c:60:6: error: incompatible type for argument 1 of 'isEmpty'
  if (isEmpty(*st)==1)
      ^
a3.c:45:5: note: expected 'struct stack *' but argument is of type 'stack'
 int isEmpty(stack *st)
     ^
a3.c: In function 'main':
a3.c:72:7: warning: passing argument 1 of 'push' makes pointer from integer without a cast
  push(* st,2);
       ^
a3.c:14:6: note: expected 'struct stack *' but argument is of type 'int'
 void push(stack *st, int item) {

1 个答案:

答案 0 :(得分:2)

这里有很多问题。

  1. 你正试图推送一些不是堆栈的东西。当您致电push(*st, 2)时,该功能正在接收int而不是stack。这是因为*st正在尝试获取存储在地址st的值,在本例中为st[0]

  2. 即使您没有在st取得价值,也绝不会真正创建stack。你只是制作一个阵列。您需要实际创建stack类型的变量并对其进行初始化。

  3. stack类型有两个数组,其中一个(st)从未被引用过。

  4. 您的push函数会在没有明显原因的情况下两次递增T。我假设T是数组的索引。

  5. 最后但并非最不重要的是,几乎不可能分辨出stack的任何字段是什么。为什么堆栈有size而不在size函数中引用它?什么是Txa?你应该尝试给这些更有意义的名字,调试一个无法阅读的程序非常困难。

  6. 还有一些风格的东西:

    1. return不是函数,而是关键字。返回的值通常不包含在括号中。

    2. 换行符通常在字符串的末尾,而不是在开头。