栈的基本操作

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

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

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

顺序栈的类型描述如下:

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

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

示意图:
栈的基本操作_第1张图片

顺序栈基本操作

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;

示意图:

栈的基本操作_第2张图片

链式栈的基本操作

入栈

//入栈
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;
}

(完)

你可能感兴趣的:(C语言)