重新教自己学算法之线性堆栈(八)

#include <iostream>
#include <cstdlib>
#include <cassert>
#include <cstring>
using namespace std;

#define STATUS int
#define TRUE 1
#define FALSE 0

typedef struct _STACK_NODE
{
    int* pData;
    int length;
    int top;
}STACK_NODE;

STACK_NODE* alloca_stack(int number)
{
    STACK_NODE* pStackNode = NULL;
    if(0 == number)
        return NULL;
    pStackNode = (STACK_NODE*)malloc(sizeof(STACK_NODE));
    assert(NULL != pStackNode);
    memset(pStackNode, 0, sizeof(STACK_NODE));

    pStackNode->pData = (int*)malloc(sizeof(int) * number);
    if(NULL == pStackNode->pData)
    {
        free(pStackNode);
        return NULL;
    }

    memset(pStackNode->pData, 0, sizeof(int) * number);
    pStackNode->length = number;
    pStackNode->top = 0;
    return pStackNode;
}

STATUS free_stack(STACK_NODE* pStackNode)
{
    if(NULL == pStackNode)
        return FALSE;

    assert(NULL != pStackNode->pData);

    free(pStackNode->pData);
    free((void*)pStackNode);
    return TRUE;
}

STATUS stack_push(STACK_NODE* pStackNode, int value)
{
    if(NULL == pStackNode)
        return FALSE;

    if(pStackNode->length == pStackNode->top)
        return FALSE;

    pStackNode->pData[pStackNode->top++] = value; //后自增,先使用在自增
    return TRUE;
}

STATUS stack_pop(STACK_NODE* pStackNode, int* value)
{
    if(NULL == pStackNode || NULL == value)
        return FALSE;

    if(0 == pStackNode->top)
        return FALSE;

    *value = pStackNode->pData[-- pStackNode->top]; //先自减,再运算
    return TRUE;
}

int const_stack_number(const STACK_NODE* pStackNode)
{
    return pStackNode->top;
}
void output_stack(const STACK_NODE* pStackNode)
{
    for (int i = 0; i < pStackNode->length; ++i)
    {
        cout<<pStackNode->pData[i]<<"  ";
    }
    cout<<endl;
} 

int main()
{
    STACK_NODE* pStackNode = alloca_stack(3);

    cout<<const_stack_number(pStackNode)<<endl;;  //0
    stack_push(pStackNode, 20);
    stack_push(pStackNode, 15);
    output_stack(pStackNode); //20,15,0
    stack_push(pStackNode,30);
    cout<<const_stack_number(pStackNode)<<endl; // 3
    output_stack(pStackNode); //20,15,30
    stack_push(pStackNode,45);
    output_stack(pStackNode);   //栈已满 20 15 30
    int* number;
    stack_pop(pStackNode,number);
    cout<<*number<<endl;  //  30
    output_stack(pStackNode);
    stack_push(pStackNode,45);   //20,15,45
    output_stack(pStackNode);
    cout<<const_stack_number(pStackNode)<<endl;   //3
    cout<<pStackNode->pData<<endl;          //0x4d24b0
    cout<<&(pStackNode->pData[0])<<endl;    //0x4d24b0
    cout<<&(pStackNode->pData[1])<<endl;    //0x4d24b4
    cout<<(pStackNode->pData + 2)<<endl;    //0x4d24b8
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值