#include<iostream>
const static int g_iStackSize = 100; //定义栈长度,为100
static int g_iStackPoint = -1;       //初始化栈指针为-1,也就是栈里一个元素都没有
//定义栈元素数据结构,可以扩展为任意类型数据
typedef struct tagStackData
{
    int iData; //栈元素的数据,整型
}stStackData,* pstStackData;
//栈只保存栈元素指针
pstStackData g_arrStack[g_iStackSize];//这个就是栈体了,一个长度为stacksize的数组
//压元素入栈,可以返回栈指针当前位置
//@param data  压入栈的元素
//@return int 为100时就是满了
int push(const pstStackData data)
{
    if(g_iStackPoint >= g_iStackSize)//也就是栈满了
    {
        //提示栈满
        printf("stack is full.\n");
        //返回栈指针位置
        return g_iStackPoint;
    }
    else//栈还没满
    {
        //压元素入栈
        g_arrStack[g_iStackPoint+1] = data;
        //移动栈指针
        ++g_iStackPoint;
        //返回栈指针位置
        return g_iStackPoint;
    }
}
//弹出元素
//@param outStackPoint输入型参数,输出栈指针位置,为-1时说明为空
//@return pstStackData 弹出的栈数据
pstStackData pop(int& outStackPoint)
{
    if(g_iStackPoint <= -1)//栈都空了,还弹
    {
        outStackPoint = -1;//栈指针位置为-1
        return NULL;
    }
    else
    {
        --g_iStackPoint;//栈指针位置向前移动
        outStackPoint = g_iStackPoint;//返回栈指针位置
        return g_arrStack[g_iStackPoint+1];//返回栈里的元素
    }
}
int main()
{
    int iInput = 0;//输入的值,当输入-1里,停止读取数据
    int iStackPoint = g_iStackPoint;//用来保存栈的指针位置
    while(-1 != iInput && 100 != iStackPoint)//当输入-1,或者栈满了的时候,就停止
    {
        scanf("%d", &iInput);//读取数据
        //创建栈元素
        pstStackData pData = new stStackData;
        pData->iData = iInput;
        //压栈
        iStackPoint = push(pData);
    }
    while(-1 != iStackPoint)//当栈指针位置不在栈尾
    {
        //依次弹出栈里的元素
        pstStackData pData = pop(iStackPoint);
        printf("pop value:%d;\n", pData->iData);
        delete pData;
    }
    system("pause");//让命令窗口暂停,观察输出3
    return 0;
}