我正在尝试在这里编写一些堆栈实现代码,并且我已经挂了几个编译错误/寻找关于我所看到的一些问题的一些澄清。
特别是我很难弄清楚我的函数运行的主函数中的输入应该是什么。他们希望指针作为输入,我如何给它们指点?
我的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) {
答案 0 :(得分:2)
这里有很多问题。
你正试图推送一些不是堆栈的东西。当您致电push(*st, 2)
时,该功能正在接收int
而不是stack
。这是因为*st
正在尝试获取存储在地址st
的值,在本例中为st[0]
。
即使您没有在st
取得价值,也绝不会真正创建stack
。你只是制作一个阵列。您需要实际创建stack
类型的变量并对其进行初始化。
stack
类型有两个数组,其中一个(st
)从未被引用过。
您的push
函数会在没有明显原因的情况下两次递增T
。我假设T
是数组的索引。
最后但并非最不重要的是,几乎不可能分辨出stack
的任何字段是什么。为什么堆栈有size
而不在size
函数中引用它?什么是T
,x
和a
?你应该尝试给这些更有意义的名字,调试一个无法阅读的程序非常困难。
还有一些风格的东西:
return
不是函数,而是关键字。返回的值通常不包含在括号中。
换行符通常在字符串的末尾,而不是在开头。