栈是一种 特殊的线性表
栈仅能在线性表的一端进行操作
栈顶(Top):允许操作的一端
栈底(Bottom):不允许操作的一端
#ifndef _KN_SEQSTACK_H_
#define _KN_SEQSTACK_H_
typedef void SeqStack;
//创建一个线性栈
SeqStack* SeqStack_Create(int capacity);
//释放一个线性栈
void SeqStack_Destory(SeqStack *stack);
//清空一个线性栈
void SeqStack_Clear(SeqStack *stack);
//向栈压入一个元素
int SeqStack_Push(SeqStack *stack, void *item);
//弹出一个元素
void*SeqStack_Pop(SeqStack *stack);
//获取栈顶元素
void*SeqStack_Top(SeqStack *stack);
//获取栈的大小
int SeqStack_Size(SeqStack *stack);
//获取栈的容量
int SeqStack_Capacity(SeqStack *stack);
#endif
/*
栈是限定仅在表尾进行插入和删除操作的线性表
允许插入和删除的一端称为栈顶,另一端称为栈底。
不含任何数据元素的栈称为空栈,栈又称为后进先出(Last In First Out)
的线性表,简称LIFO结构
栈的插入操作,叫做 进栈、压栈、入栈
栈的删除操作,叫做 出栈
队列是只允许在一端进行插入操作、而在另一端进行删除操作的线性表
*/
#include <stdio.h>
#include <string.h>
#include "knSeqlist.h"
#include "knSeqStack.h"
//使用线性表模拟栈
//创建一个线性栈
SeqStack* SeqStack_Create(int capacity)
{
return SeqList_Create(capacity);
}
//释放一个线性栈
void SeqStack_Destory(SeqStack *stack)
{
SeqList_Destroy(stack);
}
//清空一个线性栈
void SeqStack_Clear(SeqStack *stack)
{
SeqList_Clear(stack);
}
//向栈压入一个元素 相当于向链表的尾部插入元素
int SeqStack_Push(SeqStack *stack, void *item)
{
return SeqList_Insert(stack, item, SeqList_Length(stack));
}
//弹出一个元素 相当于从链表的尾部拿出元素
void*SeqStack_Pop(SeqStack *stack)
{
return SeqList_Detete(stack, SeqList_Length(stack) - 1);//链表的位置是从0开始的
}
//获取栈顶元素 相当于获取链表的尾部元素
void*SeqStack_Top(SeqStack *stack)
{
return SeqList_Get(stack, SeqList_Length(stack) - 1);
}
//获取栈的大小
int SeqStack_Size(SeqStack *stack)
{
return SeqList_Length(stack);
}
//获取栈的容量
int SeqStack_Capacity(SeqStack *stack)
{
return SeqList_Capacity(stack);
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "knSeqStack.h"
void test()
{
int i = 0;
int a[10];
int *pTmp = NULL;
SeqStack *stack = NULL;
stack = SeqStack_Create(10);
if (stack == NULL){
return;
}
for (i = 0; i < 6; i++){
a[i] = i + 1;
SeqStack_Push(stack, &a[i]);
}
pTmp = (int *)SeqStack_Top(stack);
printf("获取栈顶top:%d\n", *pTmp);
printf("capacity:%d\n", SeqStack_Capacity(stack));
printf("size:%d\n", SeqStack_Size(stack));
//元素出栈
while (SeqStack_Size(stack) > 0){
printf("pop:%d \n", *((int*)SeqStack_Pop(stack)));
}
SeqStack_Destory(stack);
}
int main()
{
test();
system("pause");
return 0;
}