数据结构 栈的实现

348 阅读2分钟

栈的原理图

GjFDN6.png

基于顺序存储实现栈

#define OK 1
#define ERROR 0

#define MAXSIZE 20

#define TRUE  1
#define FALSE 0

typedef int Status;
typedef int SElemtype;
typedef struct Stack{
    int top; // 栈顶指针
    SElemtype data[MAXSIZE];
}ZStack ;
  1. 初始化
/**
 初始化栈
 */
Status InitStatck(ZStack* stack){
    stack->top = -1;
    return OK;
}
  1. 清空栈空间
/**
    清空栈空间  栈顶置为-1 就好
 */
Status ClaerStatck(ZStack* stack){
    stack->top = -1;
    return OK;
}
  1. 判断栈是否为空
BOOL StatusEmpty(ZStack stack){
    if (stack.top == -1) {
        return TRUE;
    }else{
        return FALSE;
    }
}
  1. 栈内元素数量
int StatckLength(ZStack stack){
    return  stack.top + 1;
}
  1. 栈顶元素
Status GetTop(ZStack stack,SElemtype* value){
    if ((stack).top == -1) {
        return ERROR;
    }
    *value = (stack).data[stack.top];
    return OK;
}
  1. 入栈
Status Push(ZStack* stack, SElemtype value){
    if (stack->top == MAXSIZE - 1) {
        return ERROR;
    }
    stack->data[++stack->top] = value;
    
    return OK;
}
  1. 出栈
Status Pop(ZStack* stack, SElemtype* value){
    if (stack->top == -1) {
        return -1;
    }
    *value = stack->data[stack->top--];
    return OK;
}
  1. 遍历
Status StackTraverse(ZStack stack){
    if (stack.top == -1) {
        return ERROR;
    }
    printf("ZStack begin\n");
    for (int i = 0; i <= stack.top; i++) {
        printf(" %d", stack.data[i]);
    }
    printf("\n ZStack end\n");
    return OK;
}

验证输入为:

GjAyOH.png

基于链式存储实现栈

typedef int  Status;
typedef int SElemtype;
typedef struct StackNode{
    SElemtype data;
    struct StackNode* next;
}StackNode;

typedef StackNode* LinkStackPtr;
typedef struct Stack{
    LinkStackPtr top; // 栈顶指针
    int count;
}ZStack ;
  1. 初始化
/**
 初始化栈
 */
Status InitStatck(ZStack* stack){
    stack->top = NULL;
    stack->count = 0;
    return OK;
}
  1. 清空栈空间
/**
    清空栈空间  栈顶置为-1 就好
 */
Status ClaerStatck(ZStack* stack){
    LinkStackPtr p,q;
    p = stack->top;
    while (p) {
        q = p->next;
        free(p);
        p = q;
    }
    stack->count = 0;
    return OK;
}
  1. 判断栈是否为空
BOOL StatusEmpty(ZStack stack){
    if (stack.count == 0) {
        return TRUE;
    }else{
        return FALSE;
    }
}
  1. 栈内元素数量
int StatckLength(ZStack stack){
    return  stack.count ;
}
  1. 栈顶元素
Status GetTop(ZStack stack,SElemtype* value){
    if ((stack).top == NULL) {
        return ERROR;
    }
    *value = stack.top->data;
    return OK;
}
  1. 入栈
Status Push(ZStack* stack, SElemtype value){
  LinkStackPtr temp = (StackNode*)malloc(sizeof(StackNode));
    temp->data = value;
    temp->next = stack->top;
    stack->top = temp;

    
    stack->count ++;
    return OK;
}
  1. 出栈
Status Pop(ZStack* stack, SElemtype* value){
    if (stack->count == 0) {
        return ERROR;
    }
    *value = stack->top->data;

    LinkStackPtr temp = stack->top->next;
    free(stack->top);
    stack->top = temp;
    stack->count --;
    
    return OK;
}
  1. 遍历
Status StackTraverse(ZStack stack){
    if (stack.count == 0) {
        return ERROR;
    }
    LinkStackPtr temp = stack.top;
    printf("ZStack begin\n");
    while (temp) {
        printf(" %d", temp->data);
        temp = temp->next;
    }
   
    printf("\n ZStack end\n");
    return OK;
}

验证输入为:

GjEJ9f.png

栈的应用

再开发中,函数的调用就是栈应用的例子。

另外,在ios开发中,导航栏也是栈应用的例子。