219 阅读2分钟
  • 栈概念

栈(stack)又名堆栈,它是一种运算受限线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

  • 栈特点

    运算受限的线性表:表现为栈顶入栈、栈顶出栈,先进后出
  • 栈的顺序存储实现

    1. 顺序栈示意图
    2. 初始化
    #define OK 1
    #define ERROR 0
    #define TRUE 1
    #define FALSE 0
    #define MAXSIZE 10
    
    typedef int ElemType;
    typedef int Status;
    typedef struct{
        ElemType *data;
        int top;  //用来记录栈顶位置
    }Stack;
    
    Status creatStack(Stack *S){
        if(S->data == NULL){
        S->data = (ElemType *)malloc(sizeof(ElemType) * MAXSIZE);
        if(!S->data) exit(0);
        S->top = -1; //默认当top=-1时为空栈
    }
    return OK;
    }
    
    1. 入栈
    //入栈
    //1.先判断当前栈是否已满(满栈不能入栈)
    //2.赋值data[top+1] = data
    //3.top+1
    Status pushData(Stack *S,ElemType data){
        if(S->data == NULL) return ERROR;
        if(S->top + 1 > MAXSIZE -1) return ERROR;
        S->data[S->top + 1] = data;
        S->top ++;
        return OK;
    }
    
    1. 出栈
    //出栈
    //只需要将top减一即可
    Status popData(Stack *S){
        if(S->data == NULL) return ERROR;
        if(S->top == -1) return ERROR;
        S->top --;
        
        return OK;
    }
    
    1. 置空、获取栈长度、遍历
    //清空 只需将top置成-1即可
    Status cleanStack(Stack *S){
        if(S->data == NULL) return ERROR;
        S->top = -1;
        return OK;
    }
    
    //获取栈的长度
    Status getLength(Stack S,int *length){
        if(S.data == NULL) return ERROR;
        *length = S.top + 1;
        return OK;
    }
    
    //遍历栈
    void traverseStack(Stack S){
        for(int i = 0; i <= S.top; i ++){
            printf("%d ",S.data[i]);
        }
        printf("\n");
    }
    
  • 栈的链式存储实现

    1. 链式栈示意图
    2. 初始化
    #define OK 1
    #define ERROR 0
    #define TRUE 1
    #define FALSE 0
    
    typedef int ElemType;
    typedef int Status;
    typedef struct StackNode{
        ElemType data;
        struct StackNode *next;
    }StackNode,*StackPtr;
    
    typedef struct {
        StackPtr top;
        int length;
    } Stack;
    
    //初始化
    Status creatStack(Stack *S){
        S->top = NULL;
        S->length = 0;
        return OK;
    }
    
    1. 入栈
    //入栈
    Status pushData(Stack *S, ElemType data){
        if(!S) return ERROR;
        StackPtr temp = (StackPtr)malloc(sizeof(StackPtr));
        if(!temp) exit(0);
        temp->next = S->top;
        temp->data = data;
        S->top = temp;
        S->length ++;
        return OK;
    }
    
    1. 出栈
    //出栈
    Status popData(Stack *S){
        if(!S) return ERROR;
        if(S->length == 0) return OK;
        StackPtr temp = S->top;
        S->top = temp->next;
        S->length --;
        free(temp);
        return OK;
    }
    
    1. 遍历
    //遍历
    void traverse(Stack S){
        while (S.top) {
            printf("%d ",S.top->data);
            S.top = S.top->next;
        }
        printf("\n");
    }