C++面试笔记--循环链表,队列,栈,堆
之前已经学会了单链表的建立删除插入转置以及一些普通操作,双链表和单链表差不多,就是多了一个前驱指针,在许多操作中很方便,但是加了一个指针开销应该会大一些,总体上影响不大,这里开始讨论循环链表以及其他的一些数据结构。
1、已知n个人(以编号1,2,3,...,n分别表示)围坐在一张圆桌周围,从编号为k的人开始报数,数到m的那个人出列,他的下一个人又从k开始报数,数到m的那个人出列,依次重复下去,直到圆桌的人全部出列。试用C++编写实现。
解析:本题就是约瑟夫环问题的实际场景,要通过输入n、m、k三个正整数,求出列的序列。这个问题采用的是典型的循环链表的数据结构,就是将一个链表的尾元素指针指向队首元素:
p->link=head;
解决问题的核心步骤如下:
(1)建立一个具有n个链节点、无头节点的循环链表。
(2)确定第一个报数人的位置。
(3)不断的从链表中删除链节点,直到链表为空。
答案:
#include<iostream>
using namespace std;
typedef struct LNode
{
int data;
struct LNode *link;
}LNode,*LinkList;
//n为总人数,k为第一个开始报数的人,m为出列者喊到的数
void JOSEPHUS(int n,int k,int m)
{
//p为当前节点,r为辅助节点,指向p的前驱节点,list为头节点 LinkList p,r,list,curr; //简历循环链表 p=(LinkList)malloc(sizeof(LNode));
p->data=;
p->link=p;
curr=p;
for(int i=;i<=n;i++)
{
LinkList t=(LinkList)malloc(sizeof(LNode));
t->data=i;
t->link=curr->link;
curr->link=t;
curr=t;
}
//把当前指针移动到第一个报数的人
r=curr;
while(k--)
r=p,p=p->link;
while(n--)
{
for(int s=m-;s--;r=p,p=p->link);
r->link=p->link;
printf("%d->",p->data);
free(p);
p=r->link;
}
}
2、编程实现队列的入队/出队操作。
答案:
#include<iostream>
#include<string>
using namespace std; const int MaxQueueSize=;
class Queue{
private:
int front; //指向头结点
int rear; //指向最后一个元素的下一结点
//int *base;//用于动态分配内存,pBase保存数组的首地址
int queues[MaxQueueSize];
public:
Queue();
~Queue();
bool isEmpty();
bool isFull();
void enQueue(const int &item);
int outQueue(void);
};
Queue::Queue(){
front=;
rear=;
}
Queue::~Queue(){
front=;
rear=;
}
void Queue::enQueue(const int &item){
if(!isFull()){
queues[rear]=item;
rear++;
}
else
cout<<"队列已满!!"<<endl;
}
int Queue::outQueue(void){
if(!isEmpty()){
int value=queues[front];
return value;
front++;
}
else
cout<<"队列已空!!"<<endl;
}
bool Queue::isEmpty(){
if(rear==front)
return true;
else
return false;
}
bool Queue::isFull(){
return rear > MaxQueueSize?true:false;
}
3、用两个栈实现一个队列的功能,请用C++实现。
解析:思路如下:
假设两个栈A和B,且都为空。
可以认为栈A提供入队列的功能,栈B提供出队列的功能。
入队列:入栈A。
出队列:
(1)如果栈B不为空,直接弹出栈B的数据。
(2)如果栈B为空,则依次弹出栈A的数据,放入栈B中,再弹出栈B的数据。
答案:
#include<iostream>
#include<cstdio>
#include<stdlib.h>
#include<stack>
using namespace std;
/*
思路:1.从头到尾遍历一遍链表,利用for循环进行遍历把遍历的数据存入到栈中
2.利用栈的数据结构进行输出,递归的输出
*/
typedef struct ListNode{//链表的结构
int m_nKey;
ListNode *m_pNext;
}node; //利用栈进行输出
int printlianbiao(ListNode *pHead){//
std::stack<ListNode*> nodes;//构造一个储存泛型的栈,存储的是链表数据
ListNode* pNode=pHead;
while(pNode!=NULL){
nodes.push(pNode);//进栈
pNode=pNode->m_pNext;//一个节点的后继
}
//从栈中输出这些数据
while(!nodes.empty()){
pNode=nodes.top();//头指针指向栈顶
cout<<pNode->m_nKey<<endl;;//输出栈顶的值
nodes.pop();//出站
}
}
//利用递归进行输出
/* 1.递归的输出链表中的数
2.递归的先输出前面的数
*/
int printdigui(ListNode *pHead){
if(pHead!=NULL){
if(pHead->m_pNext!=NULL){
printdigui(pHead->m_pNext);
}
cout<<pHead->m_nKey<<endl;
}
}
node *creat(){//创建链表
node *head,*p,*s;
head=(node *)malloc(sizeof(node));//申请动态内存
p=head;
int x,cycle=;
while(cycle){
// cout<<"请输入数据"<<endl;
cin>>x;
if(x!=-){
s=(node *)malloc(sizeof(node));//为S申请动态内存
s->m_nKey=x;
p->m_pNext=s;//头指针指向第一个刚刚输入的数据
p=s;//头指针移动一位
}
else
cycle=;
}
head=head->m_pNext;//头指针指向下一位
p->m_pNext=NULL;
return head;
}
int main(){
node *pHead=creat();
cout<<"利用栈进行输出"<<endl;
printlianbiao(pHead);
cout<<"利用递归进行输出"<<endl;
printdigui(pHead); }
4、请讲诉heap和stack的差别。
解析:在进行C/C++编程时,需要程序员对内存的了解比较精准。经常需要操作的内存可分为以下几个类别:
(1)栈区(stack):由编译器自动分配和释放,存放函数的参数值、局部变量的值等。其操作方式类似于数据结构中的栈。
(2)堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表
(3)全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和静态变量在相邻的另一块区域。程序结束后由系统释放。
(4)文字常量区:常量字符串就是放在这里的,程序结束后由系统释放。
(5)程序代码区:存放函数体的二进制代码。
答案:
(1)stack的空间由操作系统自动分配/释放,heap上的空间手动分配/释放。
(2)stack空间有限,heap是很大的自由存储区。
(3)C中的malloc函数分配内存空间即在堆上,C++中对应的是new操作符。
(4)程序在编译期对变量和函数分配内存都在栈上进行,且程序运行过程中函数调用时参数的传递也在栈上进行。
C++面试笔记--循环链表,队列,栈,堆的更多相关文章
- PHP数据结构:栈、队列、堆、固定数组
数据结构:栈 队列: 堆: 固定尺寸的数组:
- php面试笔记(5)-php基础知识-自定义函数及内部函数考点
本文是根据慕课网Jason老师的课程进行的PHP面试知识点总结和升华,如有侵权请联系我进行删除,email:guoyugygy@163.com 在面试中,考官往往喜欢基础扎实的面试者,而函数相关的考点 ...
- GDB调试汇编栈堆过程的学习
前期调试 我的程序代码是: 首先,用gcc g gdb.c -o gdb -m32产生32位汇编. 输入gdb gdb进入gdb调试器 在main函数处设置一个断点:b main 用disassemb ...
- Java高级开发工程师面试笔记
最近在复习面试相关的知识点,然后做笔记,后期(大概在2018.02.01)会分享给大家,尽自己最大的努力做到最好,还希望到时候大家能给予建议和补充 ----------------2018.03.05 ...
- 从IntToHex()说起,栈/堆地址标准写法 good
学习中的一些牢骚.栈/堆地址标准写法. 2017-02-12 • 杂谈 • 暂无评论 • 老衲 •浏览 226 次 我一直都在寻找各种业务功能的最简单写法,用减法的模式来开发软件.下面是我的写法,如果 ...
- php面试笔记(3)-php基础知识-运算符
本文是根据慕课网Jason老师的课程进行的PHP面试知识点总结和升华,如有侵权请联系我进行删除,email:guoyugygy@163.com 在面试中,考官往往喜欢基础扎实的面试者,而运算符相关的考 ...
- php面试笔记(2)-php基础知识-常量和数据类型
本文是根据慕课网Jason老师的课程进行的PHP面试知识点总结和升华,如有侵权请联系我进行删除,email:guoyugygy@163.com 面试是每一个PHP初学者到PHP程序员必不可少的一步,冷 ...
- GitHub标星125k!阿里技术官用3个月总结出的24万字Java面试笔记
最近收到一位粉丝的回馈! 这位粉丝已经成功入职阿里了小编很是羡慕啊! 今天就把这份30w字Java面试笔记给大家分享出来,说来也巧这份资料也是由一位阿里技术官整理出来的这算不算是"搬起石头砸 ...
- Java内存分析--栈--堆
Java内存分析--栈--堆 JVM的内存分析: 1.栈内存 1.连续的存储空间,遵循后进先出的原则. 2.每个线程包含一个栈区,栈区只保存基础数据类型的对象和自定义对象的引用. 3.每个栈中的数据都 ...
随机推荐
- NET持续集成与自动化部署
https://www.cnblogs.com/hunternet/p/9590287.html 相信每一位程序员都经历过深夜加班上线的痛苦!而作为一个加班上线如家常便饭的码农,更是深感其痛.由于我们 ...
- UOJ348. 【WC2018】州区划分
UOJ348. [WC2018]州区划分 http://uoj.ac/problem/348 分析: 设\(g(S)=(\sum\limits_{x\in S}w_x)^p[合法]\) \(f(S)\ ...
- 学习动态性能表(20)--v$waitstat
学习动态性能表 第20篇--V$WAITSTAT 2007.6.15 本视图保持自实例启动所有的等待事件统计信息.常用于当你发现系统存在大量的"buffer busy waits" ...
- 第11篇 PSR-0 规范
Mandatory A fully-qualified namespace and class must have the following structure \<Vendor Name&g ...
- Hybrid App混合模式移动应用开发(AngularJS+Cordova+Ionic)
以前公司开发了某手机APP是通过jquerymobile来实现的,发现它对手机上的原生设备无能为力.于是在下一个项目到来之际,通过筛选最终决定使用cordova+Ionic.看起来简单,但是因为他们各 ...
- Oracle 数据库加密
数据加密 动态数据(data in motion)和静态数据(data at rest),除了手动加密,其他的加密都需要oracle企业版的高级加密(额外收费——) 1 静态数据加密 Example ...
- 配置docker中免密码SSH
更换docker国内镜像,使用DaoCloud,特别快 编写Dockerfile文件 FROM ubuntu MAINTAINER ggzone xxx@live.com ENV REFRESHED_ ...
- struts1.2里的ActionMessages的使用
转自:https://blog.csdn.net/oswin_jiang/article/details/4582187
- python爬虫实战(3)--图片下载器
本篇目标 1.输入关键字能够根据关键字爬取百度图片 2.能够将图片保存到本地文件夹 1.URL的格式 进入百度图片搜索apple,这时显示的是瀑布流版本,我们选择传统翻页版本进行爬取.可以看到网址为: ...
- windows系统中启动应用需要的端口被别的程序占用
开始--运行--cmd 进入命令提示符 输入netstat -ano 即可看到所有连接的PID 之后在任务管理器中找到这个PID所对应的程序如果任务管理器中没有PID这一项,可以在任务管理器中选&qu ...