栈是一种线性数据结构,顺序可能是 LIFO(后进先出)或 FILO(先进先出)。

堆栈主要有三个基本操作:

1、push,把元素压入栈

2、pop,从栈中弹出元素(同时从栈中移除),最后加入的第一个被弹出

3、peek 或 top,返回堆栈顶部的元素

4、isEmpty,如果 stack 为空则返回 true,否则返回 false

如何理解堆栈?

堆栈有许多现实生活中的例子。考虑在食堂中堆叠在一起的碟子,位于顶部的碟子是第一个被移除的,放置在最底部的碟子在堆中保持最长时间。

堆栈操作的时间复杂度:

push(),pop(),isEmpty() 和 peek() 都需要 O(1) 时间。我们不会在任何这些操作中运行任何循环。

实现:

有两种方法来实现堆栈:

1、使用数组

2、使用链表

使用数组实现堆栈

优点:易于实施。存取操作不涉及指针

缺点:不是动态的。不会在运行时根据需要增长和缩小。

//
// 栈的数组实现
// Created by ruby on 2019/1/17.
// #include <limits.h>
#include <stdio.h>
#include <stdlib.h> // 保存栈的数据结构
struct Stack {
int top;
int capacity;
int* array;
}; // 根据指定大小创建栈, 初始化大小为 0, 容量为 capacity
struct Stack* createStack(unsigned capacity) {
struct Stack* stack = (struct Stack*)malloc(sizeof(struct Stack));
stack->top = -1;
stack->capacity = capacity;
stack->array = (int*)malloc(capacity * sizeof(int));
return stack;
} // 栈是否已满
int isFull(struct Stack* stack) {
return stack->top == stack->capacity - 1;
} // 栈是否为空
int isEmpty(struct Stack* stack) {
return stack->top == -1;
} // 添加 item 到栈中
void push(struct Stack* stack, int item) {
if (isFull(stack)) {
printf("stack is full\n");
return;
} stack->array[++stack->top] = item;
} // 从栈中弹出一个元素
int pop(struct Stack* stack) {
if (isEmpty(stack)) {
printf("stack is empty\n");
return -1;
} return stack->array[stack->top--];
} int main()
{
struct Stack* stack = createStack(100); push(stack, 10);
push(stack, 20);
push(stack, 30); printf("%d popped from stack\n", pop(stack)); return 0;
}

  

使用链表实现堆栈

优点:堆栈的链表实现可以根据运行时的需求增长和缩小。

缺点:由于需要指针记录元素地址,需要额外的内存。

#include <limits.h>
#include <stdlib.h>
#include <stdio.h> struct StackNode {
int data;
struct StackNode* next;
}; struct StackNode* newNode(int data) {
struct StackNode* stackNode = (struct StackNode*)malloc(sizeof(struct StackNode));
stackNode->data = data;
stackNode->next = NULL;
return stackNode;
} int isEmpty(struct StackNode* root) {
return !root;
} void push(struct StackNode** root, int data) {
struct StackNode* stackNode = newNode(data);
stackNode->next = *root;
*root = stackNode;
printf("%d pushed to stack\n", data);
} int pop(struct StackNode** root) {
if (isEmpty(*root)) {
return INT_MIN;
}
struct StackNode* temp = *root;
*root = (*root)->next;
int popped = temp->data;
free(temp); return popped;
} int peek(struct StackNode* root) {
if (isEmpty(root))
return INT_MIN;
return root->data;
} int main()
{
struct StackNode* root = NULL; push(&root, 10);
push(&root, 20);
push(&root, 30); printf("%d popped from stack\n", pop(&root)); printf("Top element is %d\n", peek(root)); return 0;
}

  

栈(C语言实现)的更多相关文章

  1. 数据结构与算法之顺序栈C语言实现

    顺序栈是一种特殊的顺序表,主要操作是入栈和出栈.将顺序表加一些特定限制,就成了顺序栈. 注: 1.顺序栈C语言实现: 2.按较简单的方式实现,主要帮助理解,可在此基础上修改,更加完善: 3.提供几个简 ...

  2. 【小白成长撸】--链栈(C语言版)

    // 链栈.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <stdio.h> #include <st ...

  3. 【小白成长撸】--顺序栈(C语言版)

    // 顺序栈.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h"//test1.0--栈表仅限Int类型 #include <stdio. ...

  4. 数据结构---栈C语言实现

    #include <stdio.h> #include <stdlib.h> #define uchar unsigned char #define uint unsigned ...

  5. 逆波兰表达式[栈 C 语言 实现]

    逆波兰表达式 逆波兰表达式又叫做后缀表达式.在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表示.波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示 ...

  6. 链表栈C语言实现

    #ifndef LINKSTACK_H_INCLUDED #define LINKSTACK_H_INCLUDED #include <stdlib.h> #include <std ...

  7. 顺序表栈C语言实现

    /* * SeqStack.h * * Created on: 2019年8月1日 * Author: Administrator */ #ifndef SEQSTACK_H_ #define SEQ ...

  8. 动态栈-------C语言

    使用带头结点的单链表实现 主要使用链表中的头插来实现栈的先进后出的特点 /***************************************************** Author:Si ...

  9. 静态栈-------C语言

    /***************************************************** Author:Simon_Kly Version:0.1 Date: 20170520 D ...

  10. 顺序栈C语言实现

    "` #include <stdio.h> #define MAXSIZE 10001 #define ELEMTYPE int #define STACK_EMPTY -999 ...

随机推荐

  1. java后端面试题汇总

    转载链接:https://www.nowcoder.com/discuss/90776?type=0&order=0&pos=23&page=0 基础篇 数据结构与算法 线性表 ...

  2. 使用 PropTypes 进行类型检查

    注意: 从 React v15.5 开始 ,React.PropTypes 助手函数已被弃用,建议使用 prop-types 库 来定义contextTypes. 1 2 3 4 5 6 7 8 9 ...

  3. 第一周冲刺评论总结&&针对评论总结的改进

    关于功能:1.统计功能需完善,提高产品功能,突出功能重点,使功能完善. 2.希望增加功能. 3.该产品能查看单个同学的博客,但按要求查询时只能查找最后一次发布的博客,且未进行信息的合理分类,望之后能多 ...

  4. 《[C#] int与System.Int32有什么区别》

    最近园里的TeamOne写了一篇<[C#] int与System.Int32有什么区别>,发现里面有不少精彩的评论,所以忍不住想这篇文章总结一下:> 本文的主要参考资料: 1.< ...

  5. 1~n中1的和

    题目:给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数: 要求:写一个函数f(n),返回1到n之间出现“1“的个数, 思路: 1.先判断这个数共多少位,假设为n位: ...

  6. beat冲刺(3/7)

    目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:beta冲刺(3/7) 团队部分 后敬甲(组长) 过去两天完成了哪些任务 整理博客 ppt模板 接下来的计划 做好机动. ...

  7. Web应用程序的基本安全实践

    创建安全Web应用程序的主题非常广泛.它需要研究以了解安全漏洞.您还需要熟悉Windows..NET框架和ASP.NET的安全设施.最后,有必要了解如何使用这些安全特性来对付威胁. 即使您没有安全方面 ...

  8. Internet History, Technology and Security (Week5.1)

    Week5 The Transport layer is built on the Internetwork layer and is what makes our network connectio ...

  9. NOI2002_ Galaxy银河英雄传说86

    NOI2002_ Galaxy银河英雄传说86     公元五八○一年,地球居民迁移至金牛座α第二行星,:宇宙历七九九年,银河系的两大军事集团在巴米利恩星:杨威利擅长排兵布阵,巧妙运用各种战术屡次以少 ...

  10. 集合由量大接口派生来:Collection 和 Map

    Collection - 存放单个数据 |-List 实现类:ArrayList(Vector) LinkedList  Vector的子类Stack |-Set 实现类:HashSet   Tree ...