通过顺序存储/链式存储设计一个栈结构

390 阅读2分钟

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

一、通过顺序存储设计一个栈结构

//要存储的数据类型
typedef int SElemType;
//栈的元素空间大小
#define MAXSPACE 20
typedef struct{
    SElemType data[MAXSPACE];
    int top;
}Static;
//初始化栈表
Status initStatic(Static * S){
    S->top = -1;
    return OK;
}
//入栈
Status pushStatic(Static * S , SElemType e){
    if ((*S).top >= MAXSPACE-1) return ERROR;
    (*S).data[S->top+1] = e;
    (*S).top ++;
    return OK;
}
//出栈
Status popStatic(Static * S , SElemType *e){
    if ((*S).top <= -1)return ERROR;
    (*S).top --;
    *e = (*S).data[S->top+1];
    return OK;
}
// 查看栈内元素
Status checkStatic(Static  S ){
    for (int i =-1; i< S.top; i++) {
        printf("%d",S.data[i+1]);
    }
    printf("\n");
    return OK;
}
int main(int argc, const char * argv[]) {
    
    Static S;SElemType e;
    initStatic(&S);
    pushStatic(&S,  1); pushStatic(&S,  3);pushStatic(&S,  4);
    checkStatic(S);
    popStatic(&S,&e);
    printf("删除掉 e:%d \n",e);
    checkStatic(S);
    return 0;
}
  • 顺序栈不需要清空数组元素,根据top 获取最大下标即可,同理出栈只需要更改top-1

二、通过链式存储设计一个栈结构


//线性链表存储的栈
typedef struct nodeLink{
    SElemType data;
    struct nodeLink *next;
}nodeLink;


typedef struct nodeStatic{
    int  count;
    struct nodeLink *top;
}nodeStatic;

Status initNodeStatic(nodeStatic *S){
    S->top = NULL;
    S->count = -1;
    return OK;
}

Status pushNodeStatic(nodeStatic *S , SElemType e){
    
    nodeLink * temp = (nodeLink *)malloc(sizeof(nodeLink));
    if (!temp) return ERROR;
    nodeLink *p = S->top;
    temp->data = e;
    temp->next = p;
    S->top = temp;
    S->count ++;
    return OK;
}

Status popNodeStatic(nodeStatic *S){
    
    if (S->count<=-1) return ERROR;
    nodeLink *L =   S->top;
    S->top = S->top->next;
    S->count --;
    free(L);
    return OK;
}

Status checkNodeStatic(nodeStatic S){
   
    int count = S.count;
    nodeLink *p = S.top;
    while (count>-1) {
        printf("%d",p->data);
        p = p->next;
        count --;
    }
    printf("\n");
    return OK;
}

int main(int argc, const char * argv[]) {
    nodeStatic  S ;
    initNodeStatic(&S);
    pushNodeStatic(&S,  1);
    pushNodeStatic(&S,  2);
    pushNodeStatic(&S,  3);
    checkNodeStatic(S);
    popNodeStatic(&S);
    checkNodeStatic(S);
    return 0;
}

练习题letcode上的

  1. 括号匹配检验 假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,即()​或​[([][])]等为正确的格式,[(]或([())或(()])均为不正确的格式。输入一个包含上述括号的表达式,检验括号是否配对。

解题思路:

([{  进行入栈操作, }]) 进行出栈操作,出栈时候进行栈顶判断,不匹配则报错