在C中处理堆栈的麻烦

时间:2015-04-11 21:54:51

标签: c stack

我在使用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的最高元素不能正确。

测试用例有点奇怪,但这是我给予的工作。

提前感谢您对我的代码和问题的任何帮助!

1 个答案:

答案 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]);
    }
}