数据结构之栈

来源:互联网 发布:在哪里买正版windows 编辑:程序博客网 时间:2024/06/05 04:08

栈(stack)又称堆栈,是一种特殊的线性结构,栈的特殊之处在于:所有对于栈的操作都是在栈的一端(顶部)进行的,如对栈进行元素添加(入栈)元素删除(弹栈/出栈),按照“后进先出”的规则进行操作。栈在程序设计中特别重要,程序的调试和运行都需要栈的支撑。

一 栈的定义和基本操作

栈(stack)是限定在表的一端进行插入和删除操作的线性表。插入元素称为(入栈),删除元素称为出栈。通常将允许出栈的一端称为栈顶(top),则另一端称为栈底(bottom)。不含元素的栈称为空栈。

举个例子来说明栈的结构和操作:将书放入没有盖的盒子中,这样要将书取出来,只能将最上层的书先取出来,即将最后放入的书先取出来。所以栈又称为后进先出的线性表,简称FILO(first in last out)

栈的基本操作如下
(1)初始化一个栈
(2)判断是否是空栈
(3)判断是否是满栈
(4)进栈
(5)出栈
(6)取栈顶元素
(7)求当前栈元素个数

二 栈的顺序存储结构和基本操作

因为栈是一种特殊的线性结构,所以有两种存储结构,即顺序存储机构和链式存储结构。接下来给出顺序存储机构的相关实现代码。
#include <stdio.h>#include <stdlib.h>#define Size 100typedef 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;    }}