一 栈的定义
栈是一种具有后进先出(Last-In-First-Out,LIFO)特性的数据结构,只能在一端进行插入和删除操作,
该一端通常称为栈顶。
二 顺序栈
1、定义
顺序栈是一种使用数组结构实现的栈。它的特点是可以在数组的一端进行元素的插入(入栈)和删除
(出栈)操作。通过维护一个栈顶指针来标记栈顶元素的位置,每次入栈时,栈顶指针向上移动一位;
每次出栈时,栈顶指针向下移动一位。顺序栈的实现比较简单,但是容量固定,当栈中元素个数达到容
量限制时,会导致栈满。
2、代码示例
用数组表示栈空间,两个变量代表入栈元素以及出栈元素的位置。通过对两个元素的合理使用数组空间
实现栈的功能。
头文件
#ifndef _SEQSTACK_H
#define _SEQSTACK_H
#define SIZE 1024
typedef int seqstack_data_t;
typedef struct seq_stack
{
seqstack_data_t data[SIZE];
int top;
}seqstack , *pseqstack;
pseqstack init_seqstack();
int input_seqstack(pseqstack S , seqstack_data_t value);
int out_seqstack(pseqstack S);
int empty_seqstack(pseqstack S );
int full_seqstack(pseqstack S);
#endif
功能代码
#include <stdio.h>
#include "seqstack.h"
#include <stdlib.h>
pseqstack init_seqstack()
{
pseqstack S = (pseqstack) malloc(sizeof(seqstack));
if( NULL == S )
return NULL;
S->top = -1;
return S;
}
int input_seqstack(pseqstack S , seqstack_data_t value)
{
if( NULL == S )
return -1;
if( 0 == full_seqstack(S))
return -2;
S->data[++(S->top)] = value ;
return 0;
}
int out_seqstack(pseqstack S)
{
if( NULL == S )
return -1;
if( 0 == empty_seqstack(S))
return -2;
return S->data[(S->top)--];
}
int empty_seqstack(pseqstack S )
{
if( NULL == S )
return -1;
if( -1 == S->top )
return 0;
else
return 1;
}
int full_seqstack(pseqstack S)
{
if( NULL == S )
return -1;
if( SIZE-1 == S->top )
return 0;
else
return 1;
}
测试代码
#include <stdio.h>
#include "seqstack.h"
int main(int argc, char *argv[])
{
pseqstack S = init_seqstack();
if( NULL == S )
{
puts("init err ");
return -1;
}
puts("入栈顺序");
for( int i = 0 ; i < 10 ; i++ )
{
printf("%d ",i+1);
if( 0 != input_seqstack(S,i+1))
{
puts("input err");
return -1;
}
}
puts("");
int ret= 0;
puts("出栈顺序");
while( 0 != empty_seqstack(S) )
{
if( 0 > (ret = out_seqstack(S)))
{
puts("out err");
return -1;
}
printf("%d ", ret);
}
puts("");
return 0;
}
3、运行结果
三 链栈
1、定义
链栈是一种使用链表结构实现的栈。它的特点是可以在链表的头部进行元素的插入和删除操作。链栈不
需要预先指定容量,可以动态地分配内存,但是每个结点都需要额外的指针来指向下一个结点,相对而
言,空间消耗会更大一些。
2 、代码示例
对链表加以限制,实现栈的功能。通过头插入节点和头弹出节点,实现栈后进先出的功能。
头文件
#ifndef _CHSTACK_H
#define _CHSTACK_H
typedef int chstack_data;
typedef struct ch_stack
{
chstack_data data;
struct ch_stack * next;
}chstack,*pchstack;
pchstack init_chstack();
int input_chstack(pchstack H , chstack_data value );
int out_chstack(pchstack H);
int empty_chstack(pchstack H);
#endif
功能代码
#include <stdio.h>
#include <stdlib.h>
#include "chstack.h"
pchstack init_chstack()
{
pchstack H = (pchstack)malloc(sizeof(chstack));
if( NULL == H )
return NULL;
H->next = NULL ;
return H;
}
int input_chstack(pchstack H , chstack_data value )
{
if( NULL == H )
return -1;
pchstack L = (pchstack)malloc(sizeof(chstack));
if( NULL == L )
return -1;
L->next = H->next;
H->next = L ;
L->data = value;
return 0;
}
int out_chstack(pchstack H)
{
if( NULL == H )
return -1;
if( 0 == empty_chstack(H))
return -2;
pchstack p = H->next;
H->next = p->next;
chstack_data t = p->data;
free(p);
p = NULL;
return t;
}
int empty_chstack(pchstack H)
{
if( NULL == H )
return -1;
if( NULL == H->next )
return 0;
else
return 1;
}
测试代码
#include <stdio.h>
#include "chstack.h"
int main(int argc, char *argv[])
{
pchstack H = init_chstack();
if( NULL == H )
{
puts("init err");
return -1;
}
puts("入栈");
for( int i = 0 ; i < 10 ; i++ )
{
printf("%d " , i+1);
if( 0 != input_chstack(H , i+1))
{
puts("input err");
return -1;
}
}
puts("");
puts("出栈");
int ret = 0 ;
while( 0 != empty_chstack(H))
{
if( 0 > (ret = out_chstack( H )))
{
puts("out err");
return -1;
}
printf("%d ",ret);
}
puts("");
return 0;
}
3、运行结果