栈(STACK)又称为堆栈,是一种“特殊”的线性表,这种线性表的插入和删除运算只允许在表的一端进行。允许进行插入和删除运算的这一端称为栈顶(TOP),不允许进行插入和删除运算的另一端则称为栈底(BOTTOM);向栈中插入一个新元素称为入栈,从栈中删除一个元素称为出栈;
由于栈的插入和删除运算仅在栈顶一端进行,所以栈是一种先进后出的结构(FRIST IN LAST OUT),栈的存储结构主要分两种:栈的顺序存储结构和链接存储结构。
顺序栈:
#include <stdio.h>
#include <stdlib.h>
typedef int data_t;
typedef struct seqstack{
data_t *data ;
int top;
int maxlen;
}seqstack_t;
//创建一个指定大小的顺序栈
//1. 在内存中开辟顺序栈的空间
//2. 在内存中开辟顺序栈的数据存储空间并
//将数据存储空间的首地址赋值给顺序栈的data 成员
//3. 对其他成员进行初次赋值操作
//4. 返回创建并设置好的顺序栈的首地址
seqstack_t *Create_seqstack (int length)
{
seqstack_t *ss = (seqstack_t *)malloc(sizeof(seqstack_t));
ss->data = (data_t *) malloc(sizeof (data_t ) * length);
ss->top = -1 ;
ss->maxlen = length;
return ss;
}
//判断顺序栈是否为空
int judge_emtry_seqstack(seqstack_t *ss)
{
if (ss == NULL )
{
printf("stack is NULL\n" );
return -1 ;
}
return ss->top == -1 ;
}
//判断是否是满栈
int judge_full_seqstack(seqstack_t *ss)
{
return ss->top + 1 == ss->maxlen;
}
//入栈
//1. 先让top向后移动
//2. 将要入栈的数据保存到当前top下标所代表的存储空间ss->data [ss->top] = *data
int push_seqstack(seqstack_t *ss , data_t *data )
{
if (judge_full_seqstack(ss))
{
printf("seqstack is full\n" );
return -1 ;
}
ss->top++;
ss->data [ss->top] = *data ;
return 0 ;
}
//获得栈顶元素
int gettop_seqstack(seqstack_t *ss , data_t *data )
{
if (judge_emtry_seqstack(ss))
{
printf("seqstack is NULL\n" );
return -1 ;
}
*data = ss->data [ss->top];
return 0 ;
}
//根据元素位置获得元素数据
int get_index_seqstack(seqstack_t *ss , int index , data_t *data )
{
if (judge_emtry_seqstack(ss))
{
printf("seqstack is NULL\n" );
return -1 ;
}
if (index > ss->top)
{
printf("index over stack address\n" );
return -1 ;
}
*data = ss->data [index-1];
return 0 ;
}
//遍历顺序栈
int tarverse_seqstack(seqstack_t *ss)
{
if (judge_emtry_seqstack(ss))
{
printf("seqstack is NULL\n" );
return -1 ;
}
int count = 0 ;
while(count <= ss->top)
{
printf(" %d element stack :%d\n" , count , ss->data [count]);
count ++;
}
return 0 ;
}
//出栈
int pop_seqstack(seqstack_t *ss)
{
if (judge_emtry_seqstack(ss))
{
printf("seqstack is NULL\n" );
return -1 ;
}
ss->top
return 0 ;
}
//清空栈
int clear_seqstack(seqstack_t *ss)
{
ss->top = -1 ;
return 0 ;
}
//销毁顺序栈
//1. 释放顺序栈数据的存储空间
//2. 释放顺序表的空间
int destory_seqstack(seqstack_t *ss)
{
free(ss->data );
free(ss);
return 0 ;
}
int main()
{
seqstack_t *ss;
ss = Create_seqstack (30 );
data_t data ;
if (judge_emtry_seqstack(ss))
{
printf("seqstack is NULL\n" );
}
else
{
printf("seqstack is data\n" );
}
data = 100; push_seqstack(ss , &data ) ;
data = 200; push_seqstack(ss , &data ) ;
data = 300; push_seqstack(ss , &data ) ;
data = 4000; push_seqstack(ss , &data ) ;
data = 5000; push_seqstack(ss , &data ) ;
data = 6000; push_seqstack(ss , &data ) ;
data = 70000; push_seqstack(ss , &data ) ;
data = 80000; push_seqstack(ss , &data ) ;
data = 90000; push_seqstack(ss , &data ) ;
gettop_seqstack(ss , &data );
printf("top stack is :%d\n" ,data );
get_index_seqstack(ss , 1 , &data );
printf("element stack :%d\n" , data );
tarverse_seqstack(ss);
pop_seqstack(ss);
tarverse_seqstack(ss);
clear_seqstack(ss);
tarverse_seqstack(ss);
destory_seqstack(ss);
tarverse_seqstack(ss);
return 0 ;
}
链式栈:
include
include
以上代码为链表的基本操作,如有不对,敬请指正!!!