基本数据结构和算法
hrbeuwhw
这个作者很懒,什么都没留下…
展开
-
中序表达式的表示法与计算方法
本题是考察二叉树的三种遍历方式。 1、表达式(1+34)*5-56/7 的二叉树画法为:将运算符作为根结点,第一操作数作为左子树,第二个操作数作为右子树。结果为: ...........- .......*........./ .....+...5...56..7 ...1..34 2、表达式(1+34)*5-56/7 的后缀表达式应该为此二叉树的后序遍历序列。结果为:1转载 2012-03-29 18:39:46 · 2841 阅读 · 0 评论 -
寻找二叉树中两个子节点的最近父节点
二叉树的节点定义为如下: typedef struct Node{ int value; struct Node *Left; struct Node *Right; }*PNode; 分析:若节点q1,q2均在root的左子树中,则其最低父节点必定也在做左子树,若均在root的右子树中,同理其父节点在右子树中。若分别存在于root的左右子树中,则当前节点root就是q1,q2原创 2012-10-01 15:33:48 · 1774 阅读 · 0 评论 -
如何判断一个单链表是有环的?
一、如何判断一个单链表是有环的?(注意不能用标志位,最多只能用两个额外指针) struct node { char val; node* next;} bool check(const node* head) {} //return false : 无环;true:有环 一种O(n)的办法就是(搞两个指针,一个每次递增一步,一个每次递增两步,如果有环的话两者必然重合,反之亦然): bool转载 2012-10-01 15:46:57 · 955 阅读 · 0 评论 -
删除一个单项链表的最中间的元素,要求时间尽可能短(不能使用两次循环)
二、删除一个单项链表的最中间的元素,要求时间尽可能短(不能使用两次循环) struct link { int data; struct link *next; }; void delMiddle(link *head) { if(head == NULL) return; else if(head->next == NULL) { delete head; return;转载 2012-10-01 15:48:12 · 940 阅读 · 0 评论 -
字符串拷贝函数 char *strcpy(char *strDest, const char *strSrc)
char *strcpy(char *strDest, const char *strSrc)其中strDest 是目的字符串,strSrc 是源字符串。不调用C++/C 的字符串库函数,请编写函数 strcpy。 答案: char *strcpy(char *strDest, const char *strSrc) { assert(strDest == NULL || strSr原创 2012-10-01 15:51:44 · 1323 阅读 · 0 评论 -
指针参数问题
1. int swap(int *x,int *y) { if(x==NULL | | y==NULL) return -1; *x += *y; *y = *x- *y; *x -= *y; return 1; } 请改错,溢出已经考虑,不是错误 2. void foo(int *x, int *y) { *x += *y; *x += *转载 2012-10-01 16:04:12 · 506 阅读 · 0 评论 -
按规定实现string类
class String { public: String(const char *str = NULL); // 通用构造函数 String(const String &another); // 拷贝构造函数 ~ String(); // 析构函数 String & operater =(const String &rhs); // 赋值函数 private: char *m_data; //转载 2012-10-01 15:52:45 · 505 阅读 · 0 评论 -
二叉树后序遍历(非递归)
二叉树的递归遍历算法就不用说了;在非递归算法中,后序遍历难度大,很多书上只给出思想或者几段无法直接调试的代码,甚至有些书上是错的,当时我在研究的过程中,就是按着书上错误的代码绕了好半天,几预抓狂。好在最终摸索出来了,不禁感叹很多出书人的水平真是...... 这里将直接可以在编译器里调试的代码贴出来(在DEV-C++编译器中编译通过) 这里我们约定:空的节点用空格表示,按照转载 2012-10-05 10:23:44 · 1305 阅读 · 0 评论 -
统计一个二进制数中1的个数
int func(x) { int countx=0; while(x) { countx++; x=x&(x-1); } return countx; }转载 2012-08-10 15:36:43 · 833 阅读 · 0 评论 -
表达式字符串求值,这里表达式中只有四种运算符”+,-*\”。例如,3+6*2;
表达式字符串求值,这里表达式中只有四种运算符”+,-*\”。例如,3+6*2; 这里采用算符优先算法,可以使用两个工作栈。一个称作OPTR_STACK,用于寄存运算符;另一个称作OPND_STACK,用于寄存操作数和运算结果。算法的基本思想: 一次读入表达式中的每个字符,若是操作数则进OPND_STACK栈,若是运算符则和OPTR_STACK栈的栈顶运算符比较优先级后做相应的操作。 1原创 2012-10-19 16:15:54 · 1017 阅读 · 1 评论 -
位操作将n上调至align的倍数,align为2的倍数
//位操作将n上调至align的倍数,align为2的倍数static size_t ROUND_UP(size_t bytes,unsigned int align){return ((bytes+align-1) & ~(align-1));}原创 2012-11-09 09:38:13 · 1062 阅读 · 0 评论 -
C++笔试题收集
二、删除一个单项链表的最中间的元素,要求时间尽可能短(不能使用两次循环) struct link { int data; struct link *next; }; void delMiddle(link *head) { if(head == NULL) return; else if(head->next == NULL) { delete head; return;转载 2012-08-19 19:52:59 · 3012 阅读 · 0 评论 -
C++笔试题集
获取C++primer 二、删除一个单项链表的最中间的元素,要求时间尽可能短(不能使用两次循环) struct link { int data; struct link *next; }; void delMiddle(link *head) { if(head == NULL) return; else if(head->next == NULL) { delete h原创 2012-12-14 10:03:11 · 1053 阅读 · 0 评论 -
优秀的计算机类书籍
1、Java Java编程思想(第4版)----Java四大名著----------------Bruce Eckel(获取) JAVA 2核心技术 卷I:基础知识(原书第7版)---Java四大名著-----Cay Horstmann (获取) JAVA 2核心技术 卷II:高级特性(原书第7版)----Java四大名著-----Cay Horstmann (获取) Effe转载 2012-12-14 10:37:02 · 1630 阅读 · 0 评论 -
常用排序算法简单实现
////////////////////////////////// //常用的排序算法,简单实现 // ///////////////////////////////// #include #include void InsertSort(int * data,int length); void print_array(int * data,int length); void bubb原创 2012-09-03 19:32:39 · 416 阅读 · 0 评论 -
atoi函数实现
int my_atoi(const char* p){ assert(p != NULL); bool neg_flag = false;// 符号标记 int res = 0;// 结果 if(p[0] == '+' || p[0] == '-') neg_flag = (*p++ != '+'); while('0' *转载 2012-08-19 19:42:20 · 490 阅读 · 0 评论 -
C++ 面试常见问题
1.求下面函数的返回值(微软) int func(x) { int countx = 0; while(x) { countx ++; x = x&(x-1); } return countx; } 假定x = 9999。答案:8 思路:将x转化为2进制,看含有的1的个数。 2. 什么是“引用”?申明和使用“引用”要注意哪些问题? 答:引用就是转载 2012-08-19 19:54:02 · 5085 阅读 · 1 评论 -
从Trie树(字典树)谈到后缀树
从Trie树(字典树)谈到后缀树 作者:v_JULY_v 来源:结构之法算法之道 2011-10-23 分享到:新浪微博腾讯微博豆瓣网人人网开心网QQ空间搜狐微博更多0 引言 咱们先来看一道面试题:一个文本文件,大约有一万行,每行一个词,要求统计出其中最频繁出现的前10个词,请给出思想,给出时间复杂度分析。 之前在此文:海量数据处理面试题集锦与Bit-map详解中给出的参考答案:用t转载 2012-03-29 17:11:05 · 1601 阅读 · 0 评论 -
C/C++面试题大汇总
C/C++面试题大汇总收藏 最近因为找工作,收集了很多C语言方面方面的面试题以及答案。现在新工作搞定了,决定把这些资料发出来,送给有需要的朋友,免得再象我一样到处搜寻,实在辛苦。 发布之前先申明两点: 1 所有资料来自网络(主要是CSDN),本人只是收集和转发。 2所有问题解答(尤其是代码)只是参考,不保证正确。 先发基本问题,再发编程问题.......... 想成为嵌转载 2012-03-29 17:32:47 · 1947 阅读 · 0 评论 -
一百题
1.把二元查找树转变成排序的双向链表(树) 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。 10 / / 6 14 / / / / 4 8 12 16 转换成双向链表 4=6=8=10=12=14=16。 首先我们定义的二元查找树 节点的数据结构如下: struct BST转载 2012-03-29 17:40:30 · 7501 阅读 · 0 评论 -
链表逆序
设链表节点为 [cpp] view plaincopy typedef struct tagListNode{ int data; struct tagListNode* next; }ListNode, *List; 要求将一带链表头List head的单向链表逆序。 分析:转载 2012-03-29 16:45:07 · 446 阅读 · 0 评论 -
Trie树
Trie树既可用于一般的字典搜索,也可用于索引查找。对于给定的一个字符串a1,a2,a3,...,an.则 采用TRIE树搜索经过n次搜索即可完成一次查找。不过好像还是没有B树的搜索效率高,B树搜索算法复杂度为logt(n+1/2).当t趋向大,搜索效率变得高效。怪不得DB2的访问内存设置为虚拟内存的一个PAGE大小,而且帧切换频率降低,无需经常的PAGE切换。 10.3转载 2012-03-29 17:22:27 · 5396 阅读 · 1 评论 -
面试一百题
微软十五道面试题 1、有一个整数数组,请求出两两之差绝对值最小的值, 记住,只要得出最小值即可,不需要求出是哪两个数。 2、写一个函数,检查字符是否是整数,如果是,返回其整数值。 (或者:怎样只用4行代码编写出一个从字符串到长整形的函数?) 3、给出一个函数来输出一个字符串的所有排列。 4、(a)请编写实现malloc()内存分配函数功能一样的代码。 (b)给出一个转载 2012-03-29 17:37:14 · 1421 阅读 · 0 评论 -
Postgres内存中的Hash表结构
1. hash表概述 hash表是一种快速定位到元素位置的手段。Hash表有两个重要操作,一个是put操作,通过put操作把元素存入hash表中;一种是get操作,快速的找到元素取。 (1) 项或条目(entry):在实现中,我们把存入到hash表中的元素成为项或条目. 项的结构如下 /* *HASHELEMENT is th原创 2012-03-14 08:24:42 · 3011 阅读 · 0 评论 -
位操作基础篇之位操作全面总结
位操作篇共分为基础篇和提高篇,基础篇主要对位操作进行全面总结,帮助大家梳理知识。提高篇则针对各大IT公司如微软、腾讯、百度、360等公司的笔试面试题作详细的解答,使大家能熟练应对在笔试面试中位操作题目。 下面就先来对位操作作个全面总结,欢迎大家补充。 在计算机中所有数据都是以二进制的形式储存的。位运算其实就是直接对在内存中的二进制数据进行操作,因此处理数据的速度非常快。 在实际编转载 2012-04-05 08:19:21 · 426 阅读 · 0 评论 -
关于标准C语言的预定义宏
标准C语言预处理要求定义某些对象宏,每个预定义宏的名称一两个下划线字符开头和结尾,这些预定义宏不能被取消定义(#undef)或由编程人员重新定义。下面预定义宏表,被我抄了下来。 __LINE__ 当前程序行的行号,表示为十进制整型常量 __FILE__ 当前源文件名,表示字符串型常量 __DATE__转换的日历日期,表示为Mmm dd yyyy 形式的字符串常量,Mmm是由asctime转载 2012-04-21 15:36:11 · 5434 阅读 · 0 评论 -
VC编程功能总结
MFC设置窗体背景图片(画刷) 先载入一张图片,ID为IDB_BITMAP2 TestDlg.h中: CBrush m_brBk;//在public中定义 TestDlg.cpp中: 在初始化函数OnInitDialog()中加入: BOOL CTestDlg::OnInitDialog() { CDialog::OnInitDialog(); CBitmap bmp; b转载 2012-04-23 08:57:56 · 7456 阅读 · 0 评论 -
关于C/C++中结构体(Struct)类型的sizeof结果的探讨
关于C/C++中结构体(Struct)类型的sizeof结果的探讨 看了很多关于sizeof()的使用解释和说明,对于内置类型来说,基本没有什么问题,但是一旦将sizeof()用于结构体类型或其变量,就有点犯晕。很多地方没有给出一个可以套用的模式来说明其所得的结果是什么,有的说到了字节对其问题,例如,CPU的优化规则:对于n个字节的元素,它的首地址能被n整除,才能过的最好的性能。原创 2012-05-25 20:18:31 · 2063 阅读 · 1 评论 -
不使用中间变量交换两个变量值
交换两个变量的值,不使用第三个变量。 即a=10,b=20,交换之后a=20,b=10; 有两种解法, 一种用算术算法, 一种用^(异或) a = a + b; b = a - b; a = a - b; 或a = a^b;// 只能对int,char.. b = a^b; a = a^b转载 2012-08-10 15:25:20 · 465 阅读 · 0 评论 -
数组的循环右移
【题目】有一个整数数组,现要求实现这个整数数组的循环右移。如:1,2,3,4,5 则循环右移两位后结果是:4,5,1,2,3。 方法一:(最最容易想到的办法) void RightCircleShift_00(intbuffer[],int shift) { inti,j,tt; for(i=0;i { tt =buffer[ARRSIZE-1]转载 2012-08-10 15:36:06 · 7175 阅读 · 1 评论 -
C++中的单例模式 .
单例模式也称为单件模式、单子模式,可能是使用最广泛的设计模式。其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。有很多地方需要这样的功能模块,如系统的日志输出,GUI应用必须是单鼠标,MODEM的联接需要一条且只需要一条电话线,操作系统只能有一个窗口管理器,一台PC连一个键盘。 单例模式有许多种实现方法,在C++中,甚至可以直接用一个全局变量做到这一点转载 2013-05-23 19:01:49 · 613 阅读 · 0 评论