栈的基本操作

来源:互联网 发布:火车时刻表软件 编辑:程序博客网 时间:2024/06/07 23:06

栈是一种只允许在一端进行插入和删除操作的线性表,在表中只允许进行插入和删除的一端称为栈顶,另一端称为栈底。

栈具有“先进后出”的特性,即,先入栈的被压入栈底,后入栈的在栈顶。

栈的存储结构有两个,顺序存储和链式存储。
(1)栈的顺序存储结构
利用顺序存储方式实现的栈称为顺序栈。栈中数据元素用一个预设的足够长度的一维数组来实现。栈顶随着插入和删除而变化。

顺序栈的类型描述如下:

typedef struct {    datatype data[MAXSIZE];    int top;    //栈顶}SeqStack;

定义一个指向顺序栈的指针: SeqStack *s;

示意图:
这里写图片描述

顺序栈基本操作

1.初始化
置空栈:初始化栈顶指针。

/*初始化*/SeqStack *initStack(){    SeqStack *s;    s = (SeqStack *)malloc(sizeof(SeqStack));  //动态申请内存    s->top = -1;   //空栈时,栈顶指针top=-1    return s;}

2.进栈:首先判断栈是否满了,如果栈满,返回false。否则进栈。

/*进栈*/void push( SeqStack *s, datatype x ){    if( s->top >= MAXSIZE-1 ){  //判断栈满         printf("栈满!");     }else{        s->top++;           s->data[s->top] = x;            }} 

3.取栈顶元素

/*取栈顶元素*/int topStack( SeqStack *s ){    datatype x;    if( isEmpty(s) ){  //判断栈是否为空        printf("栈空");    }else{        return x = s->data[s->top];     }   } 

4.判断栈是否为空

/*判断栈是否为空*/ int isEmpty( SeqStack *s ){    if( s->top == -1 ){        return true;  //栈空     }else{        return false;    }   } 

5.出栈

/*出*/void pop( SeqStack *s, datatype *x ){       if( isEmpty(s) ){  //判断栈空         printf("栈空");    }else{        *x = s->data[s->top];  //将栈顶元素存入*xs->top--;       } }

(2)栈的链式存储方式
链式栈的类型描述如下:

typedef struct StackNode{    Elemtype data;    struct StackNode *next;}StackType;

示意图:

这里写图片描述

链式栈的基本操作

入栈

//入栈int push(StackType *top, ElemType x){    //将元素x压入链栈top中    StackType *p;    if( p = (StackTpe *)malloc(sizeof(StackType)) == NULL ){        return false;    }    //申请一个结点    p->data = x;    p->next = top->next;    top->next = p;    return true;}

出栈

//出栈ElemType pop(StackType *top){    StackType *p;    ElemType x;    //从top中删除栈顶元素    if( top->next == NULL ){        return NULL;    }    p = top->next;    top->next = p->next;    x = p->data;    free(p);        return x;}

(完)