顺序栈:创建&初始化、入栈、出栈、计算栈中有效数据长度、获取栈顶数据、清空栈、销毁栈

/*
    顺序栈的实现:
    初始化
    入栈
    出栈
    计算栈的有效数据长度
    获取栈顶数据
    清空栈
    销毁栈
*/

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

#define ElemType int

typedef struct __stackInfo
{
    ElemType *data;
    unsigned int top;
    unsigned int capacity;
} stackInfo;
/* 初始化 */
int initStack(stackInfo **ppS, unsigned int size)
{
    if (NULL == ppS)
    {
        printf("ppNewStack point address is not exist\n");
        return -1;
    }

stackInfo *pNewStack = (stackInfo *)malloc(sizeof(stackInfo));
    if (NULL == pNewStack)
    {
        printf("ppNewStack malloc fail\n");
        return -1;
    }

pNewStack->data = (ElemType *)malloc(sizeof(ElemType)*size);
    if (NULL == pNewStack->data)
    {
        printf("ppNewStack databuf malloc fail\n");
        
        /* 前面几篇代码就少了这里,务必要小心,记个坑: 一旦直接推出,则泄漏内存pNewStack */
        free(pNewStack);
        return -1;
    }
    
    pNewStack->capacity = size;
    pNewStack->top = 0;

*ppS = pNewStack;

return 0;
}
/* 入栈 */
int pushStack(stackInfo *pS, int val)
{
    if (NULL == pS)
    {
        printf("pStack point NULL\n");
        return -1;
    }
    
    if (pS->capacity == pS->top)
    {
        printf("pStack full\n");
        return -1;
    }
    
    pS->data[pS->top] = val;
    pS->top++;
    
    return 0;
}
/* 出栈 */
int popStack(stackInfo *pS, int *val)
{
    if ((NULL == pS) || (NULL == val))
    {
        printf("pStack point NULL or val point NULL\n");
        return -1;
    }
    
    if (pS->top <= 0)
    {
        printf("pStack empty\n");
        return -1;
    }
    
    pS->top--;
    *val = pS->data[pS->top];
    
    return 0;
}
/* 获取栈顶数据 */
int topStack(stackInfo *pS, int *val)
{
    if ((NULL == pS) || (NULL == val))
    {
        printf("pStack point NULL or val point NULL\n");
        return -1;
    }

if (0 >= pS->top)
    {
        printf("pStack empty\n");
        return -1;
    }
    
    *val = pS->data[pS->top - 1];
    
    return 0;
}
/* 计算栈中有效数据长度 */
int lengthOfStack(stackInfo *pS, unsigned int *val)
{
    if ((NULL == pS) || (NULL == val))
    {
        printf("pStack point NULL or val point NULL\n");
        return -1;
    }
    
    *val = pS->top;
    
    return 0;
}
/* 清空栈 */
int emptyStack(stackInfo *pS)
{
    if (NULL == pS)
    {
        printf("pStack point NULL\n");
        return -1;
    }
    
    while(pS->top)
    {
        /* 小技巧:如果赋值为0即0,如果赋值为FF,因16、32位平台的区别,鉴于可移植性考虑,赋值为0按位取反 */
        pS->data[pS->top--] = ~0;
    }

return 0;
}
/* 销毁栈 */
int destoryStack(stackInfo **ppS)
{
    if (NULL == ppS)
    {
        printf("pStack point address is not exist\n");
        return -1;
    }
    
    if (NULL == *ppS)
    {
        printf("pStack point NULL\n");
        return -1;
    }

emptyStack(*ppS);
    /* 关注点:1、两块动态内存需释放 2、注意释放的先后顺序 */
    free((*ppS)->data);
    free(*ppS);

return 0;
}

/* 测试入口 */
int main(void)
{
    stackInfo *pNewStack = NULL;
    unsigned int length = 0;
    int val = 0;
    
    initStack(&pNewStack, 10);

lengthOfStack(pNewStack, &length);
    printf("pNewStack valid length: %d\n", length);

/* 创建10个元素的栈,入栈11次,检查软件的容错机制 */
    for (int i=0; i<11; i++)
    {
        pushStack(pNewStack, i);
        lengthOfStack(pNewStack, &length);
        printf("pNewStack valid length: %d\n", length);
    }
    /* 入栈10个数据,出栈11次,检查软件的容错机制 */
    for (int i=0; i<11; i++)
    {
        topStack(pNewStack, &val);
        printf("pNewStack top data: %d\n", val);
        popStack(pNewStack, &val);
        printf("popStack data: %d\n", val);
    }

emptyStack(pNewStack);
    lengthOfStack(pNewStack, &length);
    printf("pNewStack valid length: %d\n", length);

destoryStack(&pNewStack);
    
    return 0;    
}

原文地址:https://www.cnblogs.com/tedani/p/9990684.html

时间: 2024-10-06 17:35:14

顺序栈:创建&初始化、入栈、出栈、计算栈中有效数据长度、获取栈顶数据、清空栈、销毁栈的相关文章

【剑指offer】栈的压入弹出序列

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26077863 剑指offer上的第22题,九度OJ上AC. 题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列. 输入: 每个测试案例包括3行: 第一行为1个整数n(

剑指Offer:栈的压入/弹出序列

栈的压入/弹出序列 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列.(注意:这两个序列的长度是相等的) class Solution { public: bool IsPopOrder(vector<int> pushV,vector<int> popV) { //

九度 1366 栈的压入弹出序列

题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列. 输入: 每个测试案例包括3行: 第一行为1个整数n(1<=n<=100000),表示序列的长度. 第二行包含n个整数,表示栈的压入顺序. 第三行包含n个整数,表示栈的弹出顺序. 输出: 对应每个测试案例,如果第二个序列是

栈的压入 弹出序列

template<typename T> bool isPopOrder(vector<T> vec, vector<T> order) { stack<T> sta; if(vec.size() != order.size()) { return false; } int i = 0, j = 0; while(j < order.size()) { if(i < vec.size() && order[j] == vec[i]

【35】栈的压入弹出判断

题目: 给定两个整数序列,第一个序列是栈的压入序列,判断第二个是不是栈的弹出序列?假设不重复,比如1,2,3,4,5和4,5,3,2,1 思路: 如果下一个弹出的数字刚好是栈顶数字,那么弹出.不在栈顶,持续压入,知道弹出的数字和栈顶一样,如果压完,还没找到,那么返回false. 代码: boolean isPopOrder(int[] push,int[] pop,int length){ boolean possible = false; int i = 0; int j = 0; Stack

找出一个整数数组中超过数组长度一半的元素(Java)

Question:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字 package com.study.zhipengs.test; import java.util.Arrays; import java.util.HashMap; import java.util.Map; /** * 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. * 例如输入一个长度为9的数组{1, 2, 3, 2, 2, 2, 5, 4, * 2}.由于数字2在数组中出现了5次,超过数组长度

剑指offer 栈的压入弹出 顺序

判断: 如果下一个弹出的数字刚好是栈顶元素,那么直接弹出 如果下一个弹出的数字不在栈顶,我们要把压栈序列中,还没有入栈的数字压入辅助栈,知道把下一个需要弹出的数字压入栈顶 如果所有的数字都入栈,但是仍然没有找到下一个弹出的数字,那么该序列不可能为弹出序列. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 class Solution { public:     bool IsPopOrder(vector<int> 

栈的压入弹出序列

首先来看图,来看下压入顺序是1.2.3.4.5.弹出顺序是4.5.3.2.1 的情况下的栈的顺序: 是这样没错.怎么来的呢? 我们结合压入和弹出的数组来考虑. 首先我看弹出的数组: 为什么4在最开始处呢?压入顺序是: 说明这个栈里己经有了1.2.3.4 于是我们弹出4. 现在弹出顺出数组里指向了5 现在我们栈里没有5啊?哪来的5.于是我们先压入5. 再弹出5 于是看我们的弹出数组现在指向了3 我们栈里第一个就是3,那么弹出3 同样我们弹出2,然后弹出1 现在栈变为空了. 其实上面我们采用了逆向思

剑指Offer20 栈的压入弹出序列是否正确

1 /************************************************************************* 2 > File Name: 20_IsPopOrder.cpp 3 > Author: Juntaran 4 > Mail: [email protected] 5 > Created Time: 2016年08月30日 星期二 19时53分19秒 6 **************************************