我在使用C语言处理堆栈时遇到问题。我想创建两个,然后用它们做各种各样的事情。当前代码的工作原理是它编译并运行但输出并不完全正确。
这是代码:
#include <stdio.h>
#include <stdlib.h>
#define STACK_SIZE 5
typedef struct stackADT {
int elements[STACK_SIZE];
int count;
} stack;
void initialize(stack *s) {
s->count = 0;
}
int push(stack *s, int value) {
if (s->count < STACK_SIZE) {
s->elements[s->count++] = value;
return s->count - 1;
}
else return -1;
}
int pop(stack *s) {
if (s->count == 0) return -1;
else s->count--;
}
int compareStack(stack *sA, stack *sB) {
int i = 0;
if (sA->count != sB->count) return 0;
else {
for (i; i < sA->count + 1; i++) {
if (sA->elements[i] != sB->elements[i]) {
return 0;
break;
}
else return 1;
}
}
}
int 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]);
}
}
void test() {
// 1.
stack *sA = malloc(sizeof(stack));
stack *sB = malloc(sizeof(stack));
initialize(sA);
initialize(sB);
// 2.
push(sA, 3);
push(sA, 4);
push(sA, 5);
push(sA, 6);
push(sA, 7);
push(sA, 8);
printf("Removed: %d\n", pop(sA));
printf("Removed: %d\n", pop(sA));
// 3.
push(sB, 12);
push(sB, 13);
push(sB, 6);
push(sB, 7);
// 4.
printStack(sB);
// 5.
printf("Removed: %d\n", pop(sB));
// 6.
push(sB, 8);
push(sB, 9);
// 7.
printf("1 if stacks are equal: %d\n", compareStack(sA, sA));
// 8.
printf("1 if stacks are equal: %d\n", compareStack(sA, sB));
// 9.
printf("Removed: %d\n", pop(sA));
printf("Removed: %d\n", pop(sA));
printf("Removed: %d\n", pop(sA));
printf("Removed: %d\n", pop(sA));
// 10.
free(sA);
free(sB);
}
int main() {
test();
}
这是输出:
Removed: 8523848
Removed: 8523848
The contents of the stack are:
3: 7
2: 6
1: 13
0: 12
Removed: 8523880
1 if stacks are equal: 1
1 if stacks are equal: 0
Removed: 8523848
Removed: 8523848
Removed: 8523848
Removed: -1
Process returned 1 (0x1) execution time : 0.251 s
Press any key to continue.
关于push
,它应该返回在elements-array中添加它的位置。我目前不确定它是否会返回正确的值,但这可能主要是由于我现在的头痛而不是因为它特别难以弄清楚。尽管如此,如果有人可以给我一些意见,我将不胜感激。
关于compareStack
,我觉得我仍然对链接列表和堆栈的工作方式感到困惑。从输出看起来它可能是正确的,因为它识别sA和sB不相等。但这可能仅仅是因为第一点我将它们的大小相互比较,而不是因为以下代码正常工作。
显然,堆栈的内容是完全错误的,因为删除的消息和sB的最高元素不能正确。
测试用例有点奇怪,但这是我给予的工作。
提前感谢您对我的代码和问题的任何帮助!
答案 0 :(得分:1)
尝试以下更改
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]);
}
}