/*

2018/8/9

顺序栈

结构体元素俩,一个数组,一个指向数组开始的上一个位置的指针

打印结果:

C语言-数据结构-顺序栈_出栈


*/

#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
#include "stdbool.h" //存放bool和false true头文件

#define MAX_SIZE 50

typedef struct Stack{
int data[MAX_SIZE];
int top;
}*PStack,Stack;


//函数声明区
PStack InitStack(void); //初始化栈
void StackPush(PStack S, int val) ; //压栈
bool StackPop(PStack S, int* val);//出栈
void StackTraverse(PStack S); //遍历栈
void StackClear(PStack S); //清空栈


int main()
{
int i,val;
PStack S = InitStack();
StackTraverse(S);

StackPush(S, 78);
StackPush(S, 223);
StackPush(S, 34);
StackPush(S, 45);
StackPush(S, 56);
StackPush(S, 7678);
StackTraverse(S);

StackPop(S, &val);
StackPop(S, &val);
StackPop(S, &val);
StackPop(S, &val);
StackPop(S, &val);
StackPop(S, &val);
StackPop(S, &val);
StackPop(S, &val);
StackPop(S, &val);
StackTraverse(S);

StackPush(S, 45);
StackPush(S, 56);
StackPush(S, 7678);
StackTraverse(S);


printf("\nHello World!!\n");
return;
}

/*初始化栈*/
PStack InitStack(void)
{
PStack S = (PStack)malloc(sizeof(Stack));
S->top = -1;
return S;
}


/* 压栈 */
void StackPush(PStack S, int val)
{
if(S->top == (MAX_SIZE-1))//判满
{
printf("栈满,请释放栈后在请求入栈!!\n");return;
}
S->data[++S->top] = val;
return;
}

/* 出栈 到val ,出错返回false */
bool StackPop(PStack S, int* val)
{
if(S->top == -1)
{
printf("出栈失败!!\n");return false;
}

*val = S->data[S->top--];
printf("val = %d出栈成功! \n",*val);
return true;
}


/* 遍历打印 */
void StackTraverse(PStack S)
{
if(S->top == -1)
{
printf("空栈无法遍历!!\n");return;
}

int i = 0;
while(i != (S->top+1))
{
printf("%d ",S->data[i++]);
}
printf("\n");
return;
}