// 顺序栈
#include <stdlib.h>
#include <stdio.h>
#define STATUS_TRUE 1
#define STATUS_FALSE 0
#define MAXSIZE 100
typedef int SElemType;
/*
* ADT - 栈的基本抽象数据类型:
* InitStack(*S)
* DestroyStack(*S)
* ClearStack(*S)
* StackEmpty(S)
* StackFull(S)
* Top(*S)
* Push(*S)
* Pop(*S)
* StackLength(S)
*/
// 顺序栈基本数据结构
typedef struct {
SElemType data[MAXSIZE];
int top;
}Stack;
/* 构造一个空栈S */
void Initial(Stack* stack)
{
stack->top = -1;
}
void Destroy(Stack* stack) {}
/* 把S置为空栈 */
void Clear(Stack* stack)
{
stack->top = -1;
}
/* 空栈判定 */
int Empty(Stack stack)
{
return stack.top == -1;
}
/* 满栈判定 */
int Full(Stack stack)
{
return stack.top == MAXSIZE - 1;
}
/* 栈长 */
int Length(Stack stack)
{
//printf("stack length:%d
", stack.top + 1);
return stack.top + 1; // 注意:stack.top + 1与stack.top++在这里大有区别
}
/* 入栈 */
int Push(Stack *stack, SElemType e)
{
if (Full(*stack))
{
return 0;
}
else
{
stack->data[++stack->top] = e;
return 1;
}
}
/* 出栈 */
int Pop(Stack* stack, SElemType *e)
{
if (Empty(*stack))
{
return 0;
}
else
{
*e = stack->data[stack->top--];
return 1;
}
}
/* 获取栈顶元素 */
int Top(Stack* stack, SElemType* e)
{
if (Empty(*stack))
{
return 0;
}
else
{
*e = stack->data[stack->top];
return 1;
}
}
void Traverse(Stack stack)
{
for (int i = 0; i < Length(stack); i++)
{
printf("stack element %d value:%d
", i, stack.data[i]);
}
}
int main()
{
Stack stack;
SElemType e;
Initial(&stack);
Push(&stack, 1);
Push(&stack, 2);
Push(&stack, 3);
Push(&stack, 4);
Push(&stack, 5);
Traverse(stack);
printf("=======================
");
Pop(&stack, &e);
Traverse(stack);
printf("Pop up elemnt:%d
", e);
printf("=======================
");
Top(&stack, &e);
Traverse(stack);
printf("Get top elemnt:%d
", e);
}