数据结构与算法
最常用的数据结构和算法(C语言版本)
存墨
做一个有情怀的程序员
展开
-
万能计算器——中缀表达式转换成后缀表达式(C++实现)【可以计算小数和负数】
核心代码与思路:int GetExprValue(vector<string> srcVec) //根据后缀表达式求值{ stack<int> temp; char op = '\0'; int a = 0; int b = 0; for (int i = 0; i < srcVec.size(); i++) { op = srcVec[i][srcVec[i].length() - 1]; if (isdigit(op)) { temp.pus原创 2022-05-10 21:08:47 · 1262 阅读 · 0 评论 -
计数排序的Python实现
学习Python的第一天,实现计数排序算法;import randomdef list_init(array, size): for i in range(size): array[i] = random.randint(1, size) return arraydef count_sort(array, size): max = array[0] min = array[0] for index in range(size): if max < array[index]:原创 2021-12-12 17:29:34 · 555 阅读 · 0 评论 -
函数中的变量为什么要放在“栈”中?
当我们要解释这个问题时,我们首先回顾一下函数的调用是如何实现的;有如下的代码:int Add(int &a, int &b){ int p = 2 * a; int q = 4 * b; return p + q;}int main(){ int m = 10; int n = 20; int x = Add(m, n); int y = 3*x; return 0;}上图对应上面的代码:当程序执行到point a时,系统先保存当前的上下文——也就是把原创 2021-11-29 21:40:08 · 416 阅读 · 0 评论 -
栈的应用——实现浏览器中的前进和后退功能
假定有4个网页A、B、C、D;为了实现前进和后退功能我们需要借助两个栈:stackX和stackY;初始时浏览器页面为空,stackX和stackY也为空;当浏览第一个网页A时,stackX.push(A);当跳转第二个网页B时,stackX.push(B);当浏览第一个网页C时,stackX.push©;当跳转第二个网页D时,stackX.push(D);当点击后退按钮时:if (!stackX.isEmpt()){ stackX.pop(); browser.reload();}原创 2021-11-29 21:15:45 · 408 阅读 · 0 评论 -
链表的就地反转算法的实现
算法示例:反转代码:void ReverseSeqLink(PSeqLink head){ if(head == NULL) { perror("head is null."); return; } if(head->length < 2) { printf("no need to reverse."); return; } PLinkNode prev = head->link原创 2021-11-14 17:47:31 · 692 阅读 · 0 评论 -
用数组解决约瑟夫环问题
C语言——数组解决约瑟夫环问题题目:有 n 个人围成一圈, 顺序排号。 从第一个人开始报数(从1 到 3 报数),凡报到 3 的人退出圈子,问最后留下的是原来第几号的那位?#include<stdio.h>#include<stdlib.h>#define NUM 3int main(){ int m; printf("Please Enter the number of player:\n"); scanf("%d",&m); int *array原创 2021-11-10 22:41:28 · 439 阅读 · 0 评论 -
归并排序算法的实现
代码如下:#include <stdio.h>#define DATA_ARRAY_SIZE 10typedef int DataType;void DisplayArray(DataType data[], const int size){ for (int i = 0; i < size; i++) { printf("%d ", data[i]); } printf("\n"); return;}void M原创 2021-11-07 22:52:10 · 76 阅读 · 0 评论 -
堆排序算法的实现
代码如下:#include <stdio.h>#define DATA_ARRAY_SIZE 10typedef int DataType;void Swap(DataType *a, DataType *b){ DataType temp = *a; *a = *b; *b = temp; return;}void DisplayArray(DataType data[], const int size){ for (int原创 2021-11-04 23:14:37 · 72 阅读 · 0 评论 -
简单选择排序算法的实现
算法思路:假设待排数据列表data共有N个元素:第1趟选出最大的那个元素和data[0]交换,第2趟选出第2大的元素和data[1]交换,第3趟选出第3大的元素和data[1]交换… 如此循环直至最后一个元素被选出;代码如下:#include <stdio.h>#define DATA_ARRAY_SIZE 10typedef int DataType;void Swap(DataType *a, DataType *b){ DataType temp = *a;原创 2021-11-03 22:16:06 · 125 阅读 · 0 评论 -
希尔排序算法的实现
在理解插入排序算法的基础上稍加调整,增加一个分组的维度就可以实现希尔排序算法#include <stdio.h>#define DATA_ARRAY_SIZE 10typedef int DataType;void DisplayArray(DataType data[], int size){ for(int i=0; i<size; i++) { printf("%d ", data[i]); } printf("\n");原创 2021-11-03 21:12:18 · 82 阅读 · 0 评论 -
普通插入排序与折半插入排序算法的实现
普通插入排序算法:void InsertSort(DataType src[], const int size){ if(size <= 1) { perror("size invaid."); return; } for(int i=1; i<size; i++) { int index = i - 1; DataType val = src[i]; while(index >=原创 2021-11-01 22:54:02 · 93 阅读 · 0 评论 -
交换排序之“快速排序”算法的实现
代码如下:#include <stdio.h>#define DATA_ARRAY_SIZE 10typedef int DataType;void DisplayArray(DataType data[], int size){ for(int i=0; i<size; i++) { printf("%d ", data[i]); } printf("\n"); return;}void QuickSort(Da原创 2021-10-31 21:30:54 · 65 阅读 · 0 评论 -
简单交换排序和冒泡排序(优化)算法的实现
#include <stdio.h>#define DATA_ARRAY_SIZE 10typedef int DataType;void Swap(DataType *a, DataType *b){ DataType temp = *a; *a = *b; *b = temp;}void DisplayArray(DataType data[], int size){ for(int i=0; i<size; i++) {原创 2021-10-31 20:49:19 · 86 阅读 · 0 评论 -
二分法查找算法的实现
前提条件:二分查找的前提是源数据为有序列表;代码如下:#include <stdio.h>typedef int DataType;int BinSearch(DataType array[], int begin, int end, DataType dest);int main(){ DataType src[] = {1,3,5,6,8,12,23,34,54,57,91}; printf("BinSearch[src] = %d.\n", BinSear原创 2021-10-31 13:34:49 · 204 阅读 · 0 评论 -
无向图的邻接表存储方式的广度优先遍历的实现
算法描述如下:1)初始化一个数组visited标记节点是否被访问;2)从第一个结点开始扫描图结点数组,如果对应的visitedfalse,则访问该结点,同时将标志设置为true,并将结点入队列;3)访问对应结点的head直到NULL(表示结束),如果visitedfalse则访问,并入队列;若该结点访问完毕则出队列;4)重复步骤3直到队列为空。分析示例:1)从第一个结点A开始访问并将标记设为true;2)依次访问A的邻接点B、C、D,在访问过程中将相应的标记设为true;并将B、C、D入队列原创 2021-10-30 20:50:52 · 1422 阅读 · 0 评论 -
无向图的深度优先搜索遍历的实现
adj_list_graph.c#include "adj_list_graph.h"bool *visited;PAdjGraph GraphInit(){ char src[GRAPH_NODE_MAX_SIZE] = {0}; PAdjGraph graph = (PAdjGraph)malloc(sizeof(AdjGraph)); if(graph == NULL) { perror("graph malloc error.");原创 2021-10-30 19:13:39 · 117 阅读 · 0 评论 -
邻接表存储方式创建无向图的实现
图的邻接表结构图:代码部分:adj_list_graph.h#ifndef _ADJ_LIST_GRAPH_H#define _ADJ_LIST_GRAPH_H#include <stdio.h>#include <stdlib.h>#define GRAPH_NODE_INF (-1)#define GRAPH_ERR (-1)#define GRAPH_SUCCESS 0typedef char VertexType;typedef struct _edg原创 2021-10-30 16:54:37 · 1009 阅读 · 0 评论 -
求二叉树的高度、宽度和叶子节点个数算法的递归实现
递归算法实现,代码如下:int GetBinTreeHeight(PBinTree tree){ if(tree == NULL) { return 0; } else { int leftHeight = GetBinTreeHeight(tree->leftChild); int rightHeight = GetBinTreeHeight(tree->rightChild); return MAX(left原创 2021-10-29 21:25:48 · 247 阅读 · 0 评论 -
二叉树的层次遍历算法的实现
借助队列实现层次遍历:binary_tree.h#ifndef _LINK_QUEUE_H#define _LINK_QUEUE_H#include <stdio.h>#include <stdlib.h>#include <string.h>#define QUEUE_ERR (-1)#define QUEUE_SUCCESS 0#define QUEUE_MAX_SIZE 128#define BIN_TREE_ERR (-1)#define原创 2021-10-28 23:43:16 · 180 阅读 · 0 评论 -
二叉树的非递归遍历算法的实现(先序、中序和后序)
上代码,不废话。/* 二叉树先序遍历 */void PreTraverTree(PBinTree tree){ if(tree == NULL) { perror("root is null."); return; } PStack nodeStack = CreateStack(); PBinTree temp = tree; while(!StackIsEmpty(nodeStack) || temp != NULL) {原创 2021-10-28 21:13:05 · 130 阅读 · 0 评论 -
创建二叉树的非递归算法实现
非递归创建二叉树(中序)算法核心思路:1)从根节点到左子树的叶子节点(创建节点、节点压栈);2)记录每个节点的状态分三种情况:初始状态、左子树建立完成状态、右子树建立完成状态;3)左右子树创建完成之后向上返回(出栈直到栈为空);具体代码如下:binary_tree.h#ifndef _BINARY_TREE_H#define _BINARY_TREE_H#include <stdio.h>#include <stdlib.h>#include <strin原创 2021-10-27 22:59:21 · 1071 阅读 · 0 评论 -
二叉树的创建及遍历算法的递归实现
通用的算法实现,不多说,直接上代码;需要注意的是在创建的时候传入的是根地址,在C++中可以用引用;binary_tree.h#ifndef _BINARY_TREE_H#define _BINARY_TREE_H#include <stdio.h>#include <stdlib.h>#include <string.h>#define STACK_ERR (-1);#define STACK_SUCCESS 0#define BIN_TREE_ER原创 2021-10-26 23:05:44 · 226 阅读 · 0 评论 -
KMP算法的C语言实现
kmp.c#include <stdio.h>#include <string.h>#include <stdlib.h>void GetNextValue(int *next, char *T, int len){ next[0] = -1; int k = -1; for (int q = 1; q <= len; q++) { while (k > -1 && T[k+1] != T[q]) { k原创 2021-10-24 00:12:31 · 60 阅读 · 0 评论 -
数据结构——“串”的顺序存储及实现
串的存储和相关的操作遵循顺序表的相关原则;需要特别注意的是串的末尾有一个特殊的结束符‘\0’,因此在进行复制、赋值、插入、连接、删除等操作时需要特殊处理;seq_string.h#ifndef _SEQ_STRING_H#define _SEQ_STRING_H#include <stdio.h>#include <stdlib.h>#include <string.h>#define STR_ERR (-1)#define STR_SUCCESS 0t原创 2021-10-22 23:02:33 · 913 阅读 · 0 评论 -
队列的链式存储及操作的实现
队列的链式存储比较简单主要思路为:link_queue.h#ifndef _LINK_QUEUE_H#define _LINK_QUEUE_H#include <stdio.h>#include <stdlib.h>#include <string.h>#define QUEUE_ERR (-1)#define QUEUE_SUCCESS 0#define QUEUE_MAX_SIZE 128#define DATA_TYPE_IS_INT#if原创 2021-10-19 23:21:40 · 163 阅读 · 0 评论 -
循环队列的顺序存储及操作的实现
循环队列需要解决的重点问题是“假溢出”现象;解决方案:队列为空的判断条件:front == rear; 队列为满的判断条件:(rear+1) % QUEUE_MAX_SIZE == front;【少用一个元素的数据空间,判断队尾标识在对头的上一个位置】。和顺序队列的不同之处就在于insert 和delete的方法的实现不同。代码如下:int InsertToQueueRear(PQueue queue, const DataType data){ if(queue == NULL) {原创 2021-10-19 23:21:04 · 127 阅读 · 0 评论 -
队列的顺序存储与操作实现
队列的特点是遵循“先进先出”规则的受限制的顺序表,在处理过程中需要注意“假溢出”问题的处理。seq_queue.h#ifndef _SEQ_QUEUE_H#define _SEQ_QUEUE_H#include <stdio.h>#include <stdlib.h>#include <string.h>#define QUEUE_ERR (-1)#define QUEUE_SUCCESS 0#define QUEUE_MAX_SIZE 128#d原创 2021-10-18 23:36:52 · 108 阅读 · 0 评论 -
栈的链式存储及操作的实现
链式栈的操作和顺序栈的操作相同,只是在实现上利用了链表的优点进行改进;link_stack.h#ifndef _LINK_STACK_H#define _LINK_STACK_H#include <stdio.h>#include <stdlib.h>#include <string.h>#define STACK_ERR (-1);#define STACK_SUCCESS 0#define DATA_TYPE_IS_CHAR#if defined原创 2021-10-17 22:15:01 · 214 阅读 · 0 评论 -
栈的顺序存储及操作的实现
栈的主要特点是先进先出,是一种操作受限的线性数据结构;代码如下:sequence_stack.h#ifndef _SEQUENCE_STACK_H#define _SEQUENCE_STACK_H#include <stdio.h>#include <stdlib.h>#include <string.h>#define STACK_MAX_SIZE 1024#define STACK_ERR (-1)#define STACK_SUCCESS 0#原创 2021-10-17 22:11:31 · 141 阅读 · 0 评论 -
双向循环链表的操作与实现
双向循环链表=普通单向链表+双指针域+循环功能;double_loop_link.h#ifndef _DOUBLE_LOOP_LINK#define _DOUBLE_LOOP_LINK#include <stdio.h>#include <stdlib.h>#include <string.h>#define DLOOP_ERR (-1)#define DLOOP_SUCCESS 0#define DATA_TYPE_IS_CHAR#if def原创 2021-10-17 18:32:17 · 126 阅读 · 0 评论 -
顺序表的链式存储及操作
相比于顺序存储,链式存储的优点有以下几点:1.插入和删除操作效率高于顺序表,当数据规模越大时,效率提高越明显;2.链式存储不需要大片连续内存空间,每个数据结点占据很少一段内存通过指针将其串起来,从而达到灵活使用的目的;当然链式存储也有不足之处:当遍历顺序表中的元素时需要从链表头部依次查找才能定位到要查询的数据结点;实现代码:seq_link.h#ifndef _SEQ_LINK_H#define _SEQ_LINK_H#include <stdio.h>#include &l原创 2021-10-16 18:07:42 · 702 阅读 · 0 评论 -
顺序表的顺序存储及操作
线性表:具有相同特性的数据元素组成的有限序列。顾名思义,线性表有以下特征:1.线性表有且只有一个开始结点,且这个开始节点没有前驱结点;2.线性表有且只有一个末尾结点,且这个末尾结点没有后继结点;3.其他结点有一个前驱结点和一个后继结点;代码如下:seq_table.h#ifndef _SEQ_TABLE_H#define _SEQ_TABLE_H#include <stdio.h>#include <stdlib.h>#include <string.原创 2021-10-16 11:58:10 · 273 阅读 · 0 评论