数据结构——栈(C语言实现)

结构定义

  栈是一种先进后出的数据结构(FILO),类比现实中的例子就是放羽毛球的圆筒,最先放进去的,会最后才拿出来用。栈是一种顺序结构,用一段连续的存储空间存储元素,所以可以用动态数组。使用栈一般都是用于处理具有完全包含关系的问题,例如括号匹配。

  1. 数据空间data。动态开辟数组空间。
  2. 空间大小size。记录数组空间的大小。
  3. 栈顶元素下标top。记录当前栈顶元素在数组中的下标。

结构操作

  1. 初始化init()。创建栈并初始化栈空间。
  2. 清除栈clear()。清除栈空间。
  3. 入栈push()。将元素压进栈空间。
  4. 出栈pop()。将元素弹出栈空间。
  5. 取元素front()。取出栈顶元素。
  6. 扩容expand()。当栈内空间已满,还要入栈时,扩容栈空间。
  7. 判空empty()。判断栈内空间是否为空。

代码实现

#include <stdio.h>
#include <stdlib.h>

typedef struct Stack {
    //定义指向动态数组空间的指针
    int *data;
    //定义栈顶下标,栈空间大小
    int top, size;
} Stack;

Stack *init(int n) {
    //开辟栈结构空间
    Stack *s = (Stack *)malloc(sizeof(Stack));
    //开辟动态数组空间
    s->data = (int *)malloc(sizeof(int) * n);
    //初始化栈空间大小
    s->size = n;
    //初始化栈顶下标
    s->top = -1;
    return s;
}

int empty(Stack *s) {
    //如果栈顶下标为-1,则为空
    return s->top == -1;
}

int expand(Stack *s) {
    //定义扩容大小
    int extr = s->size;
    //指向新空间的指针
    int *p;
    //当扩容大小不为0,重复扩容操作
    while (extr) {
        //扩容操作
        p = (int *)realloc(s->data, sizeof(int) * (s->size + extr));
        //p不为空,扩容成功
        if (p) break;
        //扩容失败,减少扩容大小
        extr /= 2;
    }
    //p为空,扩容失败,返回0
    if (!p) return 0;
    //扩容成功,更新栈空间指向,空间大小
    s->data = p;
    s->size += extr;
    return 1;
}

int top(Stack *s) {
    //返回数组空间中栈顶下标的元素
    return s->data[s->top];
}

int push(Stack *s, int val) {
    //栈结构为空,返回0
    if (s == NULL) return 0;
    //栈空间满了,进行扩容操作
    if (s->top + 1 == s->size) {
        //如果扩容失败,返回0
        if (!expand(s)) return 0;
    }
    //元素入栈,更新栈顶下标
    s->data[++(s->top)] = val;
    return 1;
}

int pop(Stack *s) {
    //栈结构为空,返回0
    if (s == NULL) return 0;
    //栈空间为空,返回0
    if (empty(s)) return 0;
    //更新栈顶下标,相当于旧元素弹出
    s->top--;
    return 1;
}

void clear(Stack *s) {
    if (s == NULL) return ;
    //释放栈开辟的动态数据
    free(s->data);
    //释放栈结构空间
    free(s);
    return ;
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
数据结构——用C语言描述(第3版)》课后答案的描述使用C语言实现各种数据结构和算法。以下是对几个常见数据结构的描述和相关代码示例。 1. 数组(Array):数组是一种线性数据结构,用于存储相同类型的元素。C语言中使用数组可以快速访问和修改元素。示例代码如下: ```c #include <stdio.h> int main() { int arr[5] = {1, 2, 3, 4, 5}; for(int i = 0; i < 5; i++) { printf("%d ", arr[i]); } return 0; } ``` 2. 链表(Linked List):链表是一种动态数据结构,通过节点之间的指针链接来存储数据。C语言中可以使用结构体和指针来实现链表。示例代码如下: ```c #include <stdio.h> #include <stdlib.h> struct Node { int data; struct Node* next; }; void printList(struct Node* head) { struct Node* current = head; while(current != NULL) { printf("%d ", current->data); current = current->next; } } int main() { struct Node* head = NULL; struct Node* second = NULL; struct Node* third = NULL; head = (struct Node*) malloc(sizeof(struct Node)); second = (struct Node*) malloc(sizeof(struct Node)); third = (struct Node*) malloc(sizeof(struct Node)); head->data = 1; head->next = second; second->data = 2; second->next = third; third->data = 3; third->next = NULL; printList(head); return 0; } ``` 3. (Stack):是一种后进先出(LIFO)的数据结构,在C语言中可以使用数组来实现。示例代码如下: ```c #include <stdio.h> #define MAX_SIZE 100 int stack[MAX_SIZE]; int top = -1; void push(int item) { if(top == MAX_SIZE - 1) { printf("Stack Overflow\n"); } else { stack[++top] = item; } } int pop() { if(top == -1) { printf("Stack Underflow\n"); return -1; } else { return stack[top--]; } } void printStack() { for(int i = top; i >= 0; i--) { printf("%d ", stack[i]); } } int main() { push(1); push(2); push(3); printf("Popped element: %d\n", pop()); printStack(); return 0; } ``` 这些示例代码展示了如何使用C语言描述《数据结构——用C语言描述(第3版)》中介绍的数据结构。读者可以根据书中提供的习题进行编程练习,进一步巩固数据结构和算法的相关知识。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值