跳转至

顺序栈面向对象封装

将顺序栈操作用 C++ 类重新组织:构造函数分配初始空间,成员函数 push / pop / gettop 封装入栈与出栈逻辑。

原代码缺少析构函数,base 指向的堆空间在对象销毁时泄漏。

修正后完整代码

#include <stdio.h>
#include <stdlib.h>

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2

#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10

typedef int status;
typedef int selemtype;

class sqstack
{
public:
    selemtype *base;
    selemtype *top;
    int stacksize;
    sqstack();
    ~sqstack() { free(base); }                           // 新增:析构函数释放内存
    status gettop(selemtype &e);
    status push(selemtype e);
    status pop(selemtype &e);
};

sqstack::sqstack()
{
    base = (selemtype *)malloc(STACK_INIT_SIZE * sizeof(selemtype));
    if (!base) exit(OVERFLOW);
    top = base;
    stacksize = STACK_INIT_SIZE;
}

status sqstack::gettop(selemtype &e)
{
    if (top == base) return ERROR;
    e = *(top - 1);
    return OK;
}

status sqstack::push(selemtype e)
{
    if (top - base >= stacksize)
    {
        selemtype *newbase = (selemtype *)realloc(base,
            (stacksize + STACKINCREMENT) * sizeof(selemtype));
        if (!newbase) exit(OVERFLOW);
        base = newbase;
        top = base + stacksize;
        stacksize += STACKINCREMENT;
    }
    *top++ = e;
    return OK;
}

status sqstack::pop(selemtype &e)
{
    if (top == base) return ERROR;
    e = *--top;
    return OK;
}

int main()
{
    sqstack S;
    selemtype e;
    S.push(10);
    S.push(20);
    S.push(30);
    S.gettop(e);
    printf("栈顶: %d\n", e);
    while (S.pop(e) == OK)
        printf("出栈: %d\n", e);
    return 0;
}

与 C 风格版本相比,OOP 版将 initstack 逻辑移入构造函数,省略了显式初始化调用。gettop 改为通过引用参数 e 返回栈顶值,避免了原代码中返回值与错误码混淆的问题。

修正点

  • 新增析构函数 ~sqstack() { free(base); },防止内存泄漏