// 顺序栈
#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);
}
原文地址:https://www.cnblogs.com/neen/p/13564702.html