栈(stack)又称堆栈,是一种特殊的线性结构,栈的特殊之处在于:所有对于栈的操作都是在栈的一端(顶部)进行的,如对栈进行元素添加(入栈)元素删除(弹栈/出栈),按照“后进先出”的规则进行操作。栈在程序设计中特别重要,程序的调试和运行都需要栈的支撑。
一 栈的定义和基本操作
栈(stack)是限定在表的一端进行插入和删除操作的线性表。插入元素称为(入栈),删除元素称为出栈。通常将允许出栈的一端称为栈顶(top),则另一端称为栈底(bottom)。不含元素的栈称为空栈。
举个例子来说明栈的结构和操作:将书放入没有盖的盒子中,这样要将书取出来,只能将最上层的书先取出来,即将最后放入的书先取出来。所以栈又称为后进先出的线性表,简称FILO(first in last out)
栈的基本操作如下
(1)初始化一个栈
(2)判断是否是空栈
(3)判断是否是满栈
(4)进栈
(5)出栈
(6)取栈顶元素
(7)求当前栈元素个数
二 栈的顺序存储结构和基本操作
因为栈是一种特殊的线性结构,所以有两种存储结构,即顺序存储机构和链式存储结构。接下来给出顺序存储机构的相关实现代码。
#include <stdio.h>
#include <stdlib.h>
#define Size 100
typedef struct
{
int data[Size];
int top;
} Stack;
顺序栈利用数组来实现 数组的大小定义为
Size 100
用top作为栈顶元素的的下标,top的范围为0到Size-1,通常规定top等于0的时候表示栈空,即数组data[0]不存放数据。
1.初始化一个栈
void init_stack(Stack *s)
{
int i;
s->top=0;
printf("请输入栈的元素 以-1结束输入");
scanf("%d",&i);
while(is_full(s)!=1&&i!=-1)
{
s->data[++s->top]=i;
scanf("%d",&i);
}
}
从键盘输入栈的元素,假定当输入为-1时作为输入结束的标志
2.判断一个栈是否为空
通过判断top是否为0来判断栈是否为空
int is_empty(Stack *s)
{
if (s->top==0)
return 1;
else
return 0;
}
3.判断一个栈是否已满
通过判断top是否为Size-1来判断栈是否已经满了
int is_full(Stack *s)
{
if (s->top==(Size-1))
return 1;
else
return 0;
}
4.数据进栈操作
void push_stack(Stack *s,int i)
{
if(is_full(s))
printf("栈已满 入栈失败");
else
{
s->data[++s->top]=i;
}
}
5.数据出栈操作
void pop_stack(Stack *s)
{
if(is_empty(s))
printf("栈已空 出栈失败");
else
{
return s->data[s->top--];
}
}
6.取栈顶元素操作
int get_top(Stack *s)
{
if(is_empty(s))
printf("栈已空 取元素失败");
else
{
printf("%d\n",s->data[s->top]);
return s->data[s->top];
}
}
7.栈置空操作
void clean_stack(Stack *s)
{
s->top=0;
}
8.求当前栈中元素的个数
int current_size(Stack *s)
{
printf("栈内有%d个元素\n",s->top);
return s->top;
}
三 栈的链式存储结构及其相关操作
typedef struct snode
{
int data;
struct snode *next;
}LinkStack;
1.初始化一个栈
LinkStack* init_linkstack()
{
int i;
LinkStack *top=NULL;
LinkStack *p;
printf("请输入栈的元素或者以-1结束");
scanf("%d",&i);
while(i!=-1)
{
p=(LinkStack*)malloc(sizeof(LinkStack));
p->data=i;
p->next=top;
top=p;
scanf("%d",&i);
}
return top;
}
2.数据进栈操作
LinkStack* push_linkstack(LinkStack *top,int x)
{
LinkStack *p;
p=(LinkStack*)malloc(sizeof(LinkStack));
p->data=x;
p->next=top;
top=p;
return top;
}
3.数据出栈操作
LinkStack* pop_linkstack(LinkStack *top)
{
LinkStack *p;
p=top;
top=top->next;
free(p);
return top;
}
4.输出栈中所有元素
void print_linkstack(LinkStack *top)
{
LinkStack *p=top;
while(p!=NULL)
{
printf("%d\n",p->data);
p=p->next;
}
}