Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中处理堆栈的问题_C_Stack - Fatal编程技术网

C语言中处理堆栈的问题

C语言中处理堆栈的问题,c,stack,C,Stack,我在处理C语言中的堆栈时遇到问题。我想创建两个,然后用它们做各种事情。当前代码的工作原理是编译并运行,但输出还不完全正确 代码如下: #包括 #包括 #定义堆栈大小5 类型定义结构stackADT{ int元素[堆栈大小]; 整数计数; }堆叠; 无效初始化(堆栈*s){ s->count=0; } int push(堆栈*s,int值){ 如果(s->计数elements[s->count++]=值; 返回s->count-1; } 否则返回-1; } int-pop(堆栈*s){ 如果(s

我在处理C语言中的堆栈时遇到问题。我想创建两个,然后用它们做各种事情。当前代码的工作原理是编译并运行,但输出还不完全正确

代码如下:

#包括
#包括
#定义堆栈大小5
类型定义结构stackADT{
int元素[堆栈大小];
整数计数;
}堆叠;
无效初始化(堆栈*s){
s->count=0;
}
int push(堆栈*s,int值){
如果(s->计数<堆栈大小){
s->elements[s->count++]=值;
返回s->count-1;
}
否则返回-1;
}
int-pop(堆栈*s){
如果(s->count==0)返回-1;
否则s->count--;
}
int比较堆栈(堆栈*sA,堆栈*sB){
int i=0;
如果(sA->count!=sB->count)返回0;
否则{
对于(i;icount+1;i++){
如果(sA->元素[i]!=sB->元素[i]){
返回0;
打破
}
否则返回1;
}
}
}
int打印堆栈(堆栈*s){
如果(s->count==0)printf(“错误:堆栈为空!\n”);
否则{
int i;
printf(“堆栈的内容为:\n”);
对于(i=s->count;i!=0;i--)printf(“%d:%d\n”,i-1,s->elements[i-1]);
}
}
无效测试(){
// 1.
stack*sA=malloc(sizeof(stack));
stack*sB=malloc(sizeof(stack));
初始化(sA);
(某人);
// 2.
推(sA,3);
推(sA,4);
推(sA,5);
推(sA,6);
推(sA,7);
推(sA,8);
printf(“已删除:%d\n”,弹出(sA));
printf(“已删除:%d\n”,弹出(sA));
// 3.
推(某人,12);
推(某人,13);
推(某人,6);
推(某人,7);
// 4.
打印堆栈(sB);
// 5.
printf(“已删除:%d\n”,pop(sB));
// 6.
推(某人,8);
推(某人,9);
// 7.
printf(“如果堆栈相等,则为1:%d\n”,比较堆栈(sA,sA));
// 8.
printf(“如果堆栈相等,则为1:%d\n”,比较堆栈(sA,sB));
// 9.
printf(“已删除:%d\n”,弹出(sA));
printf(“已删除:%d\n”,弹出(sA));
printf(“已删除:%d\n”,弹出(sA));
printf(“已删除:%d\n”,弹出(sA));
// 10.
免费(sA);
自由(某人);
}
int main(){
test();

}
尝试以下更改

int push(stack *s, int value) {
    if (s->count < STACK_SIZE) {
        s->elements[s->count++] = value;
        return s->count - 1; // not sure whether this is right
    }
    else return -1;
}


int pop(stack *s) {
    if (s->count == 0) return -1;
    else return s->elements[--s->count];
}

int compareStack(stack *sA, stack *sB) {
    int i = 0;

    if (sA->count != sB->count) return 0;

    while ( i < sA->count && sA->elements[i] == sB->elements[i] ) ++i;

    return i == sA->count;
}

void printStack(stack *s) {
    if (s->count == 0) printf("ERROR: Stack is empty!\n");
    else {
        int i;
        printf("The contents of the stack are:\n");
        for (i = s->count; i != 0; i--) printf("%d: %d\n", i - 1, s->elements[i-1]);
    }
}
int推送(堆栈*s,int值){
如果(s->计数<堆栈大小){
s->elements[s->count++]=值;
返回s->count-1;//不确定这是否正确
}
否则返回-1;
}
int-pop(堆栈*s){
如果(s->count==0)返回-1;
否则返回s->elements[--s->count];
}
int比较堆栈(堆栈*sA,堆栈*sB){
int i=0;
如果(sA->count!=sB->count)返回0;
而(icount&&sA->elements[i]==sB->elements[i])++i;
返回i==sA->count;
}
无效打印堆栈(堆栈*s){
如果(s->count==0)printf(“错误:堆栈为空!\n”);
否则{
int i;
printf(“堆栈的内容为:\n”);
对于(i=s->count;i!=0;i--)printf(“%d:%d\n”,i-1,s->elements[i-1]);
}
}

你试过valgrind吗?嗯,我刚查过valgrind,它似乎是一个分析工具?老实说,我不确定这样一个工具的输出是否对我有用。我还是很没经验。从我所能说的来看,这段代码似乎也有点过头了。这是我第一次听说它时的想法,但在处理堆栈时,它可以为问题(如果存在的话)带来光明。基本内容是:使用“-g”标志编译代码。运行'valgrind--tool=memcheck'并查看错误。它们通常引用代码中的一行。听起来很有趣。我将研究它,以便将来编码,谢谢!但是我认为这段代码剩下的问题可以归结为
printf(“删除:%d\n”,pop(sA))未产生正确的输出。使用所有警告和调试信息进行编译(例如,
gcc-Wall-Wextra-g
)。然后学习如何使用调试器(例如,
gdb
),这些更改是否用于调试?因为我实际上忘记提到的是,返回是预定义的:
compareStack
应该为相等或非相等返回1或0,
pop
应该只在失败时返回-1,其他情况都不返回。因此,我现在测试了它,没有对返回值进行更改(实现了-1到
pop
以及对
printStack
的更改,这些更改修复了显示时的错误。剩下的可能只是以下错误:
printf(“已删除:%d\n”,pop(sA))
因为这些会产生虚假的输出。我会用新的代码和输出更新OP。谢谢!好的,我可能在这里犯了一个心理错误。试图解决这个问题。我会报告结果。好的,我发现了我的问题。非常感谢!你实际上修复了一个问题,因为我误读了说明。
pop()
就是它所做的:我忘了它需要返回被删除的元素的值,这导致
printStack()
中的
printf()
,因为它们没有得到任何返回。我将使用工作代码和输出更新OP。