C语言中处理堆栈的问题
我在处理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
#包括
#包括
#定义堆栈大小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。