数据结构
文章平均质量分 79
Ckyeka
Code not merely for work, but for poetry and distant horizons.
展开
-
英文文本单词词频统计——基于HashTable
使用哈希表统计英文文本词频原创 2022-07-28 16:51:03 · 899 阅读 · 0 评论 -
KMP算法
实现代码:#include <iostream>#include <cstring>using namespace std;//获取next数组 递推法// void get_next(char* t, int next[]) {// int k, j;// next[0] = -1;// for (j = 1; t[j]; j++) {// k = next[j - 1]; //t[0...k-1] = t[j-k-1...j-2]// whi原创 2020-12-04 21:22:25 · 100 阅读 · 0 评论 -
八皇后问题的非递归解法
八皇后问题是一个古老而著名的问题。该问题要求在88格的国际象棋盘上摆放着8个皇后,使其不能互相攻击(如下图所示)。即任意两个皇后都不处于同一行、同一列或同一斜线上。求总共有多少种摆法。如图所示:递归算法已经给出,现在的问题是如何利用堆栈实现八皇后问题的求解。思路:建立一个数值栈用于存储已摆放好的棋子所在的行号以及当前的摆放进度。typedef struct SqStack { int row[MAX_SIZE + 1]; //为了方便起见数组下标从1开始 记录棋子的行号 int原创 2020-10-31 15:50:22 · 2886 阅读 · 0 评论 -
半三角矩阵的压缩存取及矩阵乘法的实现
在数组的压缩存储中我们学过了对称矩阵的存储方式,半三角矩阵的存储方式是类似的。对于n阶方阵,总共需要存储1+2+3…+n = n(n+1)/2 个元素。设i>=j,则第i行之前的行号为0~i-1,总共i行,其对应行所包含的元素个数分别为1,2,3…i,总和为(i+1)*i/2,并且aij位于第j列,在第i行中左侧还有j个元素,综上所述offest(i,j) = (i+1)*i/2 + j 。...原创 2020-10-29 20:31:04 · 811 阅读 · 0 评论 -
中缀表达式求值
代码如下:#include <iostream>#include <stack>using namespace std;int get_isp(char ch){ if (ch == '(') return 1; else if (ch == '+' || ch == '-') return 2; else if (ch == '*' || ch == '/') return 3; else if(ch == ')') return 4; else r原创 2020-11-28 21:21:33 · 204 阅读 · 0 评论 -
stack容器的基本使用
构造函数:stack<T> stk; //stack采用模板类实现, stack对象的默认构造形式stack(const stack &stk); //拷贝构造函数赋值操作:stack& operator=(const stack &stk); //重载等号操作符方法:push(elem) //入栈pop() //出栈top(原创 2020-10-23 14:02:18 · 186 阅读 · 0 评论 -
全排列的非递归算法
利用堆栈消除递归练习二从1~n这n个整数中取m个整数的全排列的递归算法很容易写出来,下面研究如何用堆栈消除递归。首先我们分析一下递归算法的思路://全排列递归算法void perm(int flag[], int a[], int k, int n, int m) /*递归算法*/ { int i; if(k==m) { for(i=0;i<m;i++) printf("%d ", a[i]); printf("\n"); return; } for(i原创 2020-10-18 16:46:05 · 1852 阅读 · 1 评论 -
利用堆栈消递归练习
某递归定义的函数如下:f(0)=0f(1)=1f(2n)=f(n)f(2n+1)=f(n)+f(2n-1)其中,n为非负整数。以上对应的C语言递归函数的实现如下:int f(int m) /* m为非负整数 */{ if(m==0) return 0; if(m==1) return 1; if(m%2==0) return f(m/2); return f(m/2)+f(m-2);}下面探究如何利用堆栈消除递归,以n=3为例:typedef struct原创 2020-10-18 11:16:49 · 897 阅读 · 4 评论 -
利用堆栈消除斐波那契数列递归
源代码:#include <iostream>using namespace std;#define MAX_SIZE 20typedef struct {int n, r1, r2;}ElemTp; // r1 = f(n-1) r2 = f(n-2)int fabonacci(int n){ ElemTp *s = new ElemTp[MAX_SIZE]; int top = -1; //栈顶指针 ElemTp a = {n, -1, - 1}; /原创 2020-10-18 00:13:46 · 311 阅读 · 0 评论 -
基于循环队列的排队买票模拟程序
编程建立循环队列存储结构,对排队买票过程进行模拟。要求程序在控制台屏幕上显示字符菜单:排队——输入新到达的买票人姓名,加入买票队列中;售票——排队队列中最前面的人购票成功,显示信息并将其从队列中删除;查看队列——从队首到队尾依次列出所有正在排队买票人的姓名;结束——退出系统。“排队”时,若队满,应提示等待(排队不成功);“售票”时,若队空,应提示无人排队(售票失败)。实现代码:#include <iostream>#include <cstring>using原创 2020-10-15 15:31:38 · 1618 阅读 · 1 评论 -
单链表实现多项式乘法
多项式乘法比较复杂,先实现多项式的加法,可以大大化简程序,输入输出采用文件的形式。代码如下:#include <iostream>#include <fstream>using namespace std;typedef struct PNode{ double c; int e; struct PNode *next;}PNode, *PolyList;//创建一个空结点void CreateNode(PolyList &p){ p = ne原创 2020-10-09 20:24:14 · 1114 阅读 · 0 评论 -
迭代法计算一元多项式
代码如下:#include <stdio.h>#include <stdlib.h>double polynomial(int a[], int i, double x, int n){ if (i > 0) return a[n - i] + x * polynomial(a, i - 1, x, n); else return a[n];}int main(){ int a[99] = { 0 }; int i, n; double x; pri原创 2020-09-25 17:32:13 · 286 阅读 · 0 评论 -
单链表及其实现
单链表和快慢指针链表是一种重要的数据结构,为了防止忘记单链表,写一篇博客用来复习。单链表采用结构指针来实现,首先定义一个结构体,里面存放数据和指向下一个结点的指针。typedef struct LNode{ int data; struct LNode* next;} LNode;typedef struct LNode *LinkList;实现代码#include <stdio.h>#include <stdlib.h>#include <time原创 2020-09-16 22:05:28 · 382 阅读 · 0 评论 -
线性表的简单实现
实现代码:#include <stdio.h>#include <stdlib.h>#define MAXSIZE 20typedef struct Sqlist{ int data[MAXSIZE]; int length;}Sqlist;//获取线性表第i个位置的元素 void GetElem(Sqlist L, int i, int *e){ //首先判断位置是否合法以及是否为空表 if (i < 1 || i > MAXSIZE ||原创 2020-09-20 10:12:59 · 259 阅读 · 0 评论 -
循环链表的应用——约瑟夫问题
循环表解决约瑟夫问题约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3。由于需要不断循环计数来确定被杀的人,所以使用循环链表可以很好地解决这个问题。循环链表本质上就是将单链表中的尾结点指向头结点,形成一个环,所以创建的方式和单链表很相似。void initList(Linklist *L, int n) //尾插法整表创建{ Linklist p, r; //声明工作指针 (*原创 2020-09-17 16:09:26 · 626 阅读 · 1 评论