数据结构栈的代码实现(C语言)

一 、栈的顺序代码实现

  1. 初始化一个空栈
bool InitStack(SqStack *s) {
    s->base = (ElemType *) malloc(STACK_INIT_SIZE * sizeof(ElemType));
    if(s->base == NULL) {
        return false;
    }
    s->top = s->base;
    s->stack_size = STACK_INIT_SIZE;
    return true;
}
  1. 判断栈是否为空
bool isEmpty(SqStack *s) {
    return s->base == s->top? true : false;
}
  1. 获得栈中元素的个数
int getLength(SqStack *s) {
    return s->top - s->base;
}
  1. 打印栈中的元素
void printStack(SqStack *s) {
    while(s->top != s->base) {
        s->top--;
        printf("elems in the stack :%d\n", *(s->top));
    }
}
  1. 向栈中插入元素
bool putStack(SqStack *s, ElemType e) {
    //栈已满重新分配存储空间
    if(s->top - s->base >= s->stack_size) {
        s->base = (ElemType *) realloc(s->base,(s->stack_size + STACK_INCREASEMENT)*sizeof(SqStack));
        if(s->base == NULL)
            return false;
        s->top = s->base + s->stack_size;
        s->stack_size += STACK_INCREASEMENT;
    }
    //入栈
    *(s->top) = e;
    s->top++;
    return true;
}
  1. 栈中元素出栈
int outStack(SqStack *s) {
    if(isEmpty(s)) return NULL;
    s->top--;
    ElemType e = *(s->top);
    return e;
}
  1. 清空栈
bool clearStack(SqStack *s) {
    s->top = s->base;
    return true;
}
  1. 主函数
int main()
{
    int n, tmp;
    SqStack S;
    InitStack(&S);
    printf("请输入要入栈的元素个数:");
    scanf("%d",&n);
    for (int i = 0; i < n; i++) {
    printf("请输入第 %d 个需要入栈的元素:",i+1);
    scanf("%d",&tmp);
    putStack(&S, tmp);
    }
    printf("length of S:%d \n",getLength(&S));
    printf("the out stack elem is : %d \n",outStack(&S));
    printf("length of S:%d \n",getLength(&S));
    printStack(&S);

    clearStack(&S);
    printf("the length of stack after cleared : %d", getLength(&S));
    return 0;
}

二 、栈的链式代码实现

  1. 初始化一个空栈
void initStack(PSTACK pStack) {

    pStack->pTop = (PNODE) malloc(sizeof(NODE));
    if (NULL != pStack->pTop) {

        pStack->pBottom = pStack->pTop;

        pStack->pTop->pNext = NULL;
    } else {
        printf("内存分配失败!程序退出!\n");
        exit(-1);
    }
    return;
}
  1. 向栈中添加元素
void pushStack(PSTACK pStack, int val) {
    //动态创建一个新结点
    PNODE pNew = (PNODE) malloc(sizeof(NODE));
    //设置新结点的数据域的值
    pNew->data = val;
    //将新结点的指针域指向之前建的空节点
    pNew->pNext = pStack->pTop;  //pStack->pTop不能换成pStack->pBottom
    //pTop指向新的结点
    pStack->pTop = pNew;
}
  1. 栈中元素出栈
bool popStack(PSTACK pStack, int *pVal) {
    if (isEmpty(pStack)) {
        return false;
    } else {
        //先保存栈顶元素的地址,然后将pTop指向下一元素,最后释放之前栈顶元素的内存
        PNODE rNode = pStack->pTop;
        *pVal = rNode->data;
        pStack->pTop = rNode->pNext;
        free(rNode);
        return true;
    }
}
  1. 判断栈是否为空
bool isEmpty(PSTACK pStack) {
    if (pStack->pTop == pStack->pBottom)
        return true;
    else
        return false;
}
  1. 遍历栈中的元素
void traverseStack(PSTACK pStack) {
    //将栈顶赋给一个临时结点,因为在遍历栈的时候不能销毁栈
    PNODE pNode = pStack->pTop;
    //循环遍历栈,直到栈底
    while (pStack->pBottom != pNode) {
        printf("%d ", pNode->data);
        pNode = pNode->pNext;
    }
    printf("\n");
    return;
}
  1. 清空栈
void clearStack(PSTACK pStack) {
    //栈为空,则退出该函数
    if (isEmpty(pStack)) {
        return;
    } else {
        //两个结点指针变量用来释放栈中元素的内存
        PNODE p = pStack->pTop;
        PNODE q = NULL;
        //循环释放内存
        while (p != pStack->pBottom) {
            q = p->pNext;
            free(p);
            p = q;
        }
        //将栈顶和栈底指向同一个指针域为空的结点
        pStack->pTop = pStack->pBottom;
        return;
    }
}
  1. 主函数
int main(void) {
    PSTACK stack;
    int val, param, a;
    initStack(stack);
    printf("请输入入栈的个数:");
    scanf("%d",&a);
    for (int i = 0; i < a; i++) {
        printf("请输入第 %d 个入栈的数:",i+1);
        scanf("%d",&param);
        pushStack(stack, param);
    }
    traverseStack(stack);
    //调用出栈的函数
    if (popStack(stack, &val))
        printf("出栈成功,出栈的元素值为:%d\n", val);
    else
        printf(" 出栈失败!");
    //调用清空栈的函数
    clearStack(stack);
    traverseStack(stack);
    system("pause");
    return 0;
}
全部评论

相关推荐

2025-12-12 19:01
南京航空航天大学 C++
秋招没咋投,准备&nbsp;wxg&nbsp;转正之后摆烂了。结果不堪字节&nbsp;HR&nbsp;的骚扰还是面了一下字节。之前想去字节的时候怎么面都挂。现在想着随便面一下结果三面技术面都意外顺利还有加面。十月中旬字节发了意向,wxg&nbsp;转正结果无响应。十月底字节拉了保温群,wxg&nbsp;口头通过,系统显示考核中。十一月初和字节&nbsp;ld&nbsp;交流之后得知&nbsp;base&nbsp;居然能选海外,甚至能小&nbsp;wlb&nbsp;一下,wxg&nbsp;无响应无人联系。十一月中旬把字节&nbsp;base&nbsp;转到了海外,wxg&nbsp;流程灰了,一问超时忘处理了,过两天又变考核中了。十一月下旬字节换了海外&nbsp;HR&nbsp;对接,问了期望薪资,wxg&nbsp;考核终于显示通过,无&nbsp;HR&nbsp;保温,无其他保温。十一月底给字节报了个天价,想吓吓他们,同时告诉微信字节要开了,微信无响应。同样十一月底字节&nbsp;HR&nbsp;告诉我确实给不到那么高,但是能拿期权补上,问能不能接受。微信无响应。同样十一月底字节&nbsp;HR&nbsp;告知了具体方案,符合预期。&nbsp;微信无响应。十二月上旬催&nbsp;wxg&nbsp;不开我就盲拒了,wxg&nbsp;HR&nbsp;火急火燎的打电话问情况,问期望。我给了一个不算夸张的总包数字,因为今年市场在涨,过了三天还不联系我,我再催,约时间下午打电话,非得在我给出的数字上压下去几万,微信又不差这点,为什么不能满足我,让我没有拒绝的理由呢?一番纠结抗争,求稳还是追求挑战,最终选择接受迎接新的挑战,因为堂吉诃德永远不会停下脚步!回想起来,在&nbsp;wxg&nbsp;谈薪的阶段,我认为并没有给予我一定的重视,即使&nbsp;HR&nbsp;表示我在实习期间的表现和之前的面评都很靠前。也没有感觉到想要争取我,虽然我表示拒了&nbsp;offer&nbsp;之后要给我加面委定&nbsp;t6&nbsp;再涨,但我三个月没面试让我面面委那就是白给,还是算了。有缘再见了我亲爱的&nbsp;wxg,再见了曾经的梦中情厂,再见亲爱的&nbsp;mt,再见亲爱的朋友们。也再见,北京的一切。我想润了。秋招结束,卸载牛客,下一个三年,下一个五年,下一个十年后再来看看。
面试中的大熊猫爱吃薯...:我嫉妒得狗眼通红
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务