作者: SkyHive | 来源:发表于2017-10-14 11:13 被阅读0次

栈是一种先进后出的线性数据结构,规定只允许在一端进行插入和删除元素的操作。其中进栈操作又叫做压栈(Push),出栈操作又叫做弹出(Pop)。允许进行操作的一端叫做栈顶(top),另一端叫做栈底(base)。

分类

  • 顺序栈:数组实现
  • 链式栈:链表实现

代码实现

顺序栈

1.构建栈的结构

#define MAXSIZE 1024        //定义栈的空间大小
typedef struct stack{
  int data[MAXSIZE];    
  int top;
}Stack;

2.初始化

Stack *Init(){
    Stack stack;
    stack = (Stack*)malloc(sizeof(Stack));
    if(!stack){
        printf("Memory allocation failed!");
        return NULL;
    }
    else{
        stack->top = -1;    //C语言数组下标从0开始
        printf("Init successfully!");
        return stack;
    }
}

3.判断栈是否为空

int isEmpty(Stack* stack){
    if(stack->top == -1){
        printf("The stack is empty!");
        return 1;
    }
    return 0;
}

4.判断栈是否满

int isFull(Stack* stack){
    if(stack->top == MAXSIZE-1){
        printf("The satck is full!");
        return 1;
    }
    return 0;
}

5.进栈操作(Push)

void Push(Stack* stack,int item){
    if(isFull(stack)){
        return;
    }
    stack->data[++stack->top] = item;
}

入站操作先移动Top,再压入元素

6.出栈操作(Pop)

int Pop(Stack* stack){
    if(isEmpty(stack)){
        return -99;
    }
    return stack->data[stack->top--];   //返回被弹出的元素
}

7.遍历操作

void Traverse(Stack* satck){
    printf("The items in the stack are:\n");
    for (int i=stack->top;i >= 0;i--){
        printf ("%d\n",stack->data[i]);
    }
}
链式栈

1.构建栈的结构

typedef struct node{
    int data;
    struct node* next;
}Node;

2.初始化栈

Node* Init(){
    Node* s;
    s = (Node*)malloc(sizeof(Node));
    if(!s){
        printf("Memory allocation failed!");
        return NULL;
    }
    else{
        printf("Init successfully!");
        s->next = NULL;
        return s;
    }
}

3.判断栈是否为空

int isEmpty(Node* s){
    return (s->next == NULL);
}

4.进栈操作

void Push(Node* s,int item){
    Node* node;     //为插入的元素构建一个节点
    node = (Node*)malloc(sizeof(Node));
    if(!node){
        printf("Memory allocation failed!");
        return NULL;
    }
    node->data = item;
    node->next = s->next;       //这里写成node->next = NULL应该也可以吧
    s->next = node;
}

5.出栈操作

int Pop(Node* s){
    Node* Top;
    int data;
    if(isEmpty(s)){
        printf("The stack is empty!");
        return -99;
    }
    Top = s->next;
    s->next = Top->next;
    data = Top->data;
    free(Top);
    return data;
}

6.遍历操作

void Traverse(Node* s){
    printf("The items in the stack are:\n");
    Node* p;
    p = s;
    while (p->next != NULL){
        printf("%d\n",p->data);
        p = p->next;
    }
}

相关文章

  • Java实现栈

    数组栈:压栈、出栈、返回栈顶元素 链式栈:压栈、出栈、返回栈顶元素

  • 数据结构之 栈

    栈结构 链式栈 一.栈结构体 1构建空栈 2栈置空 3判断栈空 4获取栈顶 5入栈 6出栈 7便利栈 二.链式栈 ...

  • 栈和队列

    1、栈 栈是一种先进先出的数据结构。栈顶进栈,栈顶出栈。 数据结构 栈的初始化 进栈 出栈 栈的最小值 2、队列 ...

  • 递归累加数组

    入栈 5入栈 4入栈 3入栈 2入栈 1出栈 [1 0]出栈 [2 1 0]出栈 [3 2 1 0]出栈 [4 3...

  • 栈的逻辑结构和存储结构

    main()进栈s(1)进栈s(0)进栈 s(0)出栈s(1)出栈main()出栈 顺序栈 一个数组 + 指向栈顶...

  • 单调栈 2020-06-12(未经允许,禁止转载)

    1.单调栈 指栈内元素保持单调性的栈结构,分为单调增栈(栈底到栈顶元素递增)和单调减栈(栈底到栈顶元素递减) 2....

  • 链栈的操作

    链栈的定义 链栈的操作 初始化 判断栈空 入栈 出栈

  • 函数调用栈平衡

    栈平衡 栈平衡:函数调用前后的栈顶指针指向的位置不变 内平栈 外平栈 内平栈: 指的是在函数调用返回之前使栈保持...

  • 栈的简单Java实现

    栈栈的特点是先进后出,出栈、入栈都是在栈顶操作。

  • 汇编学习-入栈和出栈

    栈有两个基本的操作:入栈和出栈。入栈就是将一个新的元素放到栈顶,出栈就是从栈顶取出一个元素。栈顶的元素总是最后入栈...

网友评论

    本文标题:

    本文链接:https://www.haomeiwen.com/subject/rrexuxtx.html