创建一个字符循环队列,实现字符元素入队列、出队列、显示队列元素等操作。要求为用户提供选择式菜单?

C语言
数据结构
三、 创建一个字符循环队列,实现字符元素入队列、出队列、显示队列元素等操作。要求为用户提供选择式菜单

1个回答

Status InitQueue(SqQueue &Q)
{ // 构造一个空队列Q
Q.base=(QElemType )malloc(MAXQSIZE*sizeof(QElemType));
if(!Q.base) // 存储分配失败
exit(OVERFLOW);
Q.front=Q.rear=0;
return OK;
}
Status DestroyQueue(SqQueue &Q)
{ // 销毁队列Q,Q不再存在
if(Q.base)
free(Q.base);
Q.base=NULL;
Q.front=Q.rear=0;
return OK;
}
Status ClearQueue(SqQueue &Q)
{ // 将Q清为空队列
Q.front=Q.rear=0;
return OK;
}
Status QueueEmpty(SqQueue Q)
{ // 若队列Q为空队列,则返回TRUE,否则返回FALSE
if(Q.front==Q.rear) // 队列空的标志
return TRUE;
else
return FALSE;
}
int QueueLength(SqQueue Q)
{ // 返回Q的元素个数,即队列的长度
return(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
}
Status GetHead(SqQueue Q,QElemType &e)
{ // 若队列不空,则用e返回Q的队头元素,并返回OK,否则返回ERROR
if(Q.front==Q.rear) // 队列空
return ERROR;
e=
(Q.base+Q.front);
return OK;
}
Status EnQueue(SqQueue &Q,QElemType e)
{ // 插入元素e为Q的新的队尾元素
if((Q.rear+1)%MAXQSIZE==Q.front) // 队列满
return ERROR;
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXQSIZE;
return OK;
}
Status DeQueue(SqQueue &Q,QElemType &e)
{ // 若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERROR
if(Q.front==Q.rear) // 队列空
return ERROR;
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXQSIZE;
return OK;
}
Status QueueTraverse(SqQueue Q,void(*vi)(QElemType))
{ // 从队头到队尾依次对队列Q中每个元素调用函数vi().一旦vi失败,则操作失败
int i;
i=Q.front;
while(i!=Q.rear)
{
vi(*(Q.base+i));
i=(i+1)%MAXQSIZE;
}
printf("\n");
return OK;
}

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
线性表及栈与队列的实现 -- 栈
1.问题描述: 针对线性表或栈或队列(三者任选一种逻辑结构),按要求完成类(模板)的实现,并使用提供的main函数测试程序。 2.完成时有几种选择: a.栈的实现。 b. 队列的实现。 c. 线性表的实现。 这里是栈的实现。务必按照提供的代码为基础进行补充。 template <typename T> class Stack { public: Stack(); //构造函数 bool empty() const ; //判断S是否为空栈 bool full() const; //判断栈S是否为满, ~Stack(); //将栈S清空 int size() const; //求栈S的长度,即栈S中的元素的个数 T & top() const; //返回栈S的栈顶元素 void push( const T &e ); //入栈操作,将数据元素e插入栈S的当前栈顶 T & pop(); //出栈操作,删除栈S的栈顶元素,并返回其值 private: // 补充 }; //测试的main函数 int main() { Stack<char> sc; //stack of char Stack<int> si; //Stack of int char ch = ' '; // 不断输入字符到栈中,=结束 while (ch != '=') { cin >> ch; if (ch == 'a') sc.push('A'); sc.push(ch); } cout << "top=" << sc.top() << "size=" << sc.size() << endl; cout << "pop " << sc.pop() << endl; while (!sc.empty()) cout << sc.pop()<< " "; cout << endl; int x = 1; // 不断输入int到栈中,0结束 while (x != 0) { cin >> x; if (x > 10) si.push(10000); si.push(x); } cout << "top=" << si.top() << "size=" << si.size() << endl; cout << "pop " << si.pop() << endl; while (!si.empty()) cout << si.pop()<< "/"; cout << endl; return 0; } 急求,用c++补充
求如何用队列实现密码加密解密
密码加密原理描述如下: 将明文(一个字符串)的每个字符按照字母表后移,每个字符的后移个数由秘 钥值列表确定,如果 明文比密钥值列表长,可以从头再使用这个密钥值列表。 如明文:student,秘钥:2345, 则加密方法是:s(向后移动2位)变成u,t(向后移动3位)变成w,u(向 后移动4位)变成y,d(向后移动5位) 变成i,此时秘钥用完,所 以从头开始用2进行移位加密,依此类推可以得到加密后的密文。而 解密时,只需将密文根据秘钥反推就可以得到明文。
(修改报错的程序)线性表及栈与队列的实现 -- 栈
1.问题描述: 针对线性表或栈或队列(三者任选一种逻辑结构),按要求完成类(模板)的实现,并使用提供的main函数测试程序。 2.完成时有几种选择: a.栈的实现。 b. 队列的实现。 c. 线性表的实现。 这里是栈的实现。务必按照提供的代码为基础进行补充。 #include<iostream> #include<cstdlib> using namespace std; #define MAX 100 template <typename T> class Stack { public: Stack(); //构造函数 bool empty() const ; //判断S是否为空栈 bool full() const; //判断栈S是否为满, ~Stack(); //将栈S清空 int size() const; //求栈S的长度,即栈S中的元素的个数 T & top() const; //返回栈S的栈顶元素 void push( const T &e ); //入栈操作,将数据元素e插入栈S的当前栈顶 T & pop(); //出栈操作,删除栈S的栈顶元素,并返回其值 private: // 补充 T data[MAX]; int cur; }; template <typename T> Stack<T>::Stack() { cur = 0; } template<typename T> bool Stack<T>::empty() const { cur = 0; } template<typename T> bool Stack<T>::full() const { return cur >= MAX; } template<typename T> Stack<T>::~Stack() {} template<typename T> int Stack<T>::size() const { return cur; } template<typename T> T & Stack<T>::top() const { if (cur == 0) throw "stack is empty"; return data[cur - 1]; } template<typename T> void Stack<T>::push( const T &e ) { if (cur >= MAX) throw "stack is full"; data[cur++] = e; } template<typename T> T & Stack<T>::pop() { if (cur == 0) throw "stack is empty"; return data[--cur]; } //测试的main函数 int main() { Stack<char> sc; //stack of char Stack<int> si; //Stack of int char ch = ' '; // 不断输入字符到栈中,=结束 while (ch != '=') { cin >> ch; if (ch == 'a') sc.push('A'); sc.push(ch); } cout << "top=" << sc.top() << "size=" << sc.size() << endl; cout << "pop " << sc.pop() << endl; while (!sc.empty()) cout << sc.pop()<< " "; cout << endl; int x = 1; // 不断输入int到栈中,0结束 while (x != 0) { cin >> x; if (x > 10) si.push(10000); si.push(x); } cout << "top=" << si.top() << "size=" << si.size() << endl; cout << "pop " << si.pop() << endl; while (!si.empty()) cout << si.pop()<< "/"; cout << endl; return 0; } 这个程序报错 return data[cur - 1];这一行显示错误,怎么修改???
为什么在队尾插入元素时总是提示内存出错(C语言新人)
写了一个层序遍历创建二叉树的函数,但在入队列部分提示内存出错,求大佬指点... 出错函数:void EnQueue(BiTree e) 错误提示:内存出错 ``` #include<stdio.h> #include<stdlib.h> #define link 1; #define child 0; typedef struct BiTNode{ char data; struct BiTNode* lchild; struct BiTNode* rchild; int LTag = child; int RTag = child; }BiTNode,*BiTree; typedef struct QNode{ BiTNode* data; struct QNode* next; }QNode,*QueuePtr; typedef struct { QueuePtr front;//队头指针 QueuePtr rear;//队尾指针 }LinkQueue; LinkQueue Q;//用队列存储需要访问的树的结点 void IniiLinkQueue(){ Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode)); Q.front->next = NULL; return ; } bool QueueEmpty(){ //判断队列是否为空队列,若不是,返回true;否则,返回false if(Q.front == Q.rear) return false; return true; } void EnQueue(BiTree e){ //插入e为Q的新的队尾元素 QueuePtr p = (QueuePtr)malloc(sizeof(QNode)); p->data = e; p->next = NULL; Q.rear->next = p;//报错位置 Q.rear = p; return ; } BiTree DeQueue(){ //删除Q的队头元素,并返回其值 BiTree e = Q.front->next->data; if(Q.front->next == Q.rear) Q.rear = Q.front; else Q.front->next = Q.front->next->next; return e; } void createBiTree(BiTree T){ //按层序遍历创建二叉树 char ch; EnQueue(T);//将树的根结点存入队列 while(QueueEmpty()){ while((ch = getchar()) != '\n'){ T = DeQueue(); if(ch != '-'){ //若输入字符不为'-',表示当前结点不为空,将字符存入结点,并将其左右孩子地址存入队列中 T->data = ch; T->lchild = (BiTree)malloc(sizeof(BiTNode)); T->rchild = (BiTree)malloc(sizeof(BiTNode)); EnQueue(T->lchild); EnQueue(T->rchild); } else{ //若输入字符为'-',表示当前结点为空,无需将其左右孩子入队 T->data = NULL; } } } return ; } ```
一道精炼字符串笔试题及队列试题
1. 请完成函数,该函数输入一个纯英文字符串,请打印出该字符串中每个字符(区分大小写)出现的次数,并按照出现的次数从大到小排列,如输入“asisaB”,则打印出a=2,s=2,i=1,B=1。 <br />注:要求不能使用如Map,List等集合类。 <br /> <br /> <br />2.使用Java实现阻塞队列BlockQueue,请插入数据调用Offer,如果已满则等待。获取数据调用take,如果队列为空,则等待。请完成该类 <br /> <br />望详细指点迷津
一道有趣的字符串笔试题 以及队列问题笔试题
1. 请完成函数,该函数输入一个纯英文字符串,请打印出该字符串中每个字符(区分大小写)出现的次数,并按照出现的次数从大到小排列,如输入“asisaB”,则打印出a=2,s=2,i=1,B=1。 注:要求不能使用如Map,List等集合类。 2.使用Java实现阻塞队列BlockQueue,请插入数据调用Offer,如果已满则等待。获取数据调用take,如果队列为空,则等待。请完成该类 请高人写出程序代码 加有些详细注解更佳 谢谢!!!!!!!!!!!!!!!!!
请问,linux下消息队列通信为什么收不到消息
A1.c #include stdio.h> #include stdlib.h> #include string.h> #include sys/types.h> #include sys/msg.h> #include unistd.h> #include sys/ipc.h> int main(){ int ret = -1; int msg_flags, smsg_id ,rmsg_id;/*创建消息队列函数所用的标志位,以及收消息与发消息的队列id*/ key_t key1,key2;/*队列的键值*/ struct msgmbuf{/*消息的缓冲区结构*/ int mtype; char mtext[10]; }; struct msgmbuf msg_mbuf;/*创建消息缓冲区*/ int msg_sflags,msg_rflags;/*收发消息函数所用的标志位*/ char *msgpath1 = "/mnt/hgfs/";/*消息key1产生所用的路径*/ char *msgpath2 = "/mnt/hgfs/sourcecode";/*消息key2产生所用的路径*/ key1 = ftok(msgpath1,'b');/*产生key1*/ key2 = ftok(msgpath2,'a');/*产生key2*/ if(key1 != -1 || key2 != -1)/*产生key成功*/ { printf("成功建立KEY\n"); } else/*产生key失败*/ { printf("建立KEY失败\n"); } msg_flags = IPC_CREAT;//|IPC_EXCL; /*设置创建消息的标志位*/ smsg_id = msgget(key1, msg_flags|0666); /*建立收消息的消息队列*/ rmsg_id = msgget(key2, msg_flags|0666); /*建立发消息的消息队列*/ if( -1 == smsg_id || -1 == rmsg_id) { printf("消息建立失败\n"); return 0; } pid_t pid; pid = fork();/*通过fork()创建子进程,主进程进行发消息,子进程进行收消息*/ while(1){ if(pid != 0){/*主进程*/ msg_sflags = IPC_NOWAIT;/*当消息队列满了的时候不等待*/ msg_mbuf.mtype = 10;/*设置发送的消息类型*/ sleep(1); char *content; content = (char*)malloc(10*sizeof(char)); printf("input:\n"); scanf("%s",content);/*用户输入内容*/ if(strncmp(content,"end",3) == 0)/*如果前三个字符为end,则跳出循环*/ break; memcpy(msg_mbuf.mtext,content,10);/*复制字符串*/ ret = msgsnd(smsg_id, &msg_mbuf, 10, msg_sflags);/*发送消息*/ if( -1 == ret) { printf("发送消息失败\n"); } } else{/*子进程*/ sleep(1); msg_mbuf.mtype = 10;/*设置收消息的类型*/ msg_rflags = IPC_NOWAIT;//|MSG_NOERROR; ret = msgrcv(rmsg_id, &msg_mbuf,10,10,msg_rflags);/*接收消息*/ if( -1 == ret) { /*可添加出错处理等*/ } else { printf("接收消息成功,长度:%d\n",ret); printf("content:%s\n",msg_mbuf.mtext); } } } ret = msgctl(rmsg_id, IPC_RMID,NULL);/*删除收消息的队列*/ if(-1 == ret) { printf("删除消息失败\n"); return 0; } return 0; } A2.c #include stdio.h> #include stdlib.h> #include string.h> #include sys/types.h> #include sys/msg.h> #include unistd.h> #include sys/ipc.h> int main(){ int ret = -1; int msg_flags, smsg_id ,rmsg_id;/*创建消息队列函数所用的标志位,以及收消息与发消息的队列id*/ key_t key1,key2;/*队列的键值*/ struct msgmbuf{/*消息的缓冲区结构*/ int mtype; char mtext[10]; }; struct msgmbuf msg_mbuf;/*创建消息缓冲区*/ int msg_sflags,msg_rflags;/*收发消息函数所用的标志位*/ char *msgpath1 = "/mnt/hgfs/";/*消息key1产生所用的路径*/ char *msgpath2 = "/mnt/hgfs/sourcecode";/*消息key2产生所用的路径*/ key1 = ftok(msgpath1,'b');/*产生key1*/ key2 = ftok(msgpath2,'a');/*产生key2*/ if(key1 != -1 || key2 != -1)/*产生key成功*/ { printf("成功建立KEY\n"); } else/*产生key失败*/ { printf("建立KEY失败\n"); } msg_flags = IPC_CREAT;//|IPC_EXCL; /*设置创建消息的标志位*/ smsg_id = msgget(key2, msg_flags|0666); /*建立收消息的消息队列*/ rmsg_id = msgget(key1, msg_flags|0666); /*建立发消息的消息队列*/ if( -1 == smsg_id || -1 == rmsg_id) { printf("消息建立失败\n"); return 0; } pid_t pid; pid = fork();/*通过fork()创建子进程,主进程进行发消息,子进程进行收消息*/ while(1){ if(pid != 0){/*主进程*/ msg_sflags = IPC_NOWAIT;/*当消息队列满了的时候不等待*/ msg_mbuf.mtype = 10;/*设置发送的消息类型*/ sleep(1); char *content; content = (char*)malloc(10*sizeof(char)); printf("input:\n"); scanf("%s",content);/*用户输入内容*/ if(strncmp(content,"end",3) == 0)/*如果前三个字符为end,则跳出循环*/ break; memcpy(msg_mbuf.mtext,content,10);/*复制字符串*/ ret = msgsnd(smsg_id, &msg_mbuf, 10, msg_sflags);/*发送消息*/ if( -1 == ret) { printf("发送消息失败\n"); } } else{/*子进程*/ sleep(1); msg_mbuf.mtype = 10;/*设置收消息的类型*/ msg_rflags = IPC_NOWAIT;//|MSG_NOERROR; ret = msgrcv(rmsg_id, &msg_mbuf,10,10,msg_rflags);/*接收消息*/ if( -1 == ret) { /*可添加出错处理等*/ } else { printf("接收消息成功,长度:%d\n",ret); printf("content:%s\n",msg_mbuf.mtext); } } } ret = msgctl(rmsg_id, IPC_RMID,NULL);/*删除收消息的队列*/ if(-1 == ret) { printf("删除消息失败\n"); return 0; } return 0; } 头文件<>无法识别,均删去了<
c++如何实现二维队列?
问题是,现在有一段字符串,我要搜索找出里面的重复的字母,和他们的下标。比如: abcaabbcd 建立成表: a 0 3 4 b 1 5 6 c 2 7 因为重复字母个数不定,重复的下标数也不确定。各位能不能想到什么办法实现呢?
关于c语言实现队列的算法,总会出现内存方面错误,求高人指明错误
//实现一个队列,任意输入一串字符,以999为结束标志,然后打出队列中的数据 //定义队列 typedef struct QNode { int data; QNode *next; }QNode,*QueuePtr; typedef struct { QueuePtr front; QueuePtr rear; }LinkQuede; //初始化一个链队 void initQueue(LinkQuede *p) { p->front = p->rear = new QNode; if (!p->front) exit(0); p->front->next = NULL; } //入队 void Enqueue(LinkQuede *p,int e) { QueuePtr q; q = new QNode; if (!q) exit(0); q->next = NULL; q->data = e; p->rear->next = q; p->rear = q; } //出队 void Dequeue(LinkQuede *p,int*e) { if (p->front == p->rear) exit(0); QueuePtr q = new QNode; if (!q)exit(0); q = p->front->next; *e = q->data; p->front->next = q->next; delete q; }//销毁队列 void destryQueue(LinkQuede *p) { while (p->front) { p->rear = p->front->next; delete(p->front); p->front = p->rear; } }//测试程序 int main() { int e; LinkQuede q; initQueue(&q); cout << "请输入一个队列:" << endl; cin >> e; while (e != 999) { Enqueue(&q,e); cin >> e; } cout << "打印队列元素:" << endl; while (q.front != q.rear) { Dequeue(&q,&e); cout << e << " "; } cout << endl; destryQueue(&q); if (q.front == q.rear) cout << "ok" << endl; system("pause"); return 0; }
页面置换算法的OPT算法的具体代码解释看不懂,主要问题是 在超出list容量之后的部分,以及LRU算法及其调用的MyStack栈的具体解释?????
``` public class OPT { private final int capacity = 3;// 构造一个初始容量为3的空列表 private int[] index = new int[2];//申请数组下标的容量为2 private List<Integer> list = new ArrayList<Integer>(capacity);//定义一个有界阻塞容器capacity即队列 public OPT(int[] arr) { for (int i = 0; i < arr.length; i++) { if (list.size() < capacity) { // 小于list初始容量 if (!list.contains(arr[i])) { // list没有该页面,将其添加进list尾部 list.add(arr[i]);//列表+1 } else { continue; } } else {// 超出list容量 index[0] = 100; index[1] = 101; if (!list.contains(arr[i])) { // 下一个页面如果不在list中 int a = 0; for (int j = i; j < arr.length; j++) { if (list.contains(arr[j])) { // arr[j]这个页面会在测试数据中会出现较早 if (index[0] != list.indexOf(arr[j])) { //indexOf()的用法:查找arr[j]中,第一次出现指定字符串的位置。 位置不是下标为0 index[a++] = list.indexOf(arr[j]);// 返回此列表中首次出现的指定元素的索引 if (a == 2) { break; } } } } list.set(noExist(), arr[i]);// 置换掉永不使用的,或许在最长时间内不再访问的页面 } else { // 下一个页面在list中 continue;//列表保持不变 } } traverse();//调用traverse函数 } System.out.println("访问页面需从外存调入的次数为:"+(num-1));//计算访问页面需要从外存调入的次数 System.out.println("缺页率为:"+(1-(float)(num-1)/arr.length));//计算缺页率 } ``` [https://blog.csdn.net/AdvancingStone/article/details/79110586]( "这是我的参考代码,我需要的帮助是具体解释OPT和LRU及其调用的MyStack栈的每行代码的具体注释")
求教大佬们,这个“读取位置 0xCCCCCCCC 时发生访问冲突。”的异常该如何解决?
程序是数据结构实验的图的存储和遍历,就是输入一个图转化成邻接矩阵,再把邻接矩阵变成邻接表,最后深度优先遍历邻接表生成森林: ``` #include <stdio.h> #include <malloc.h> #include <stdlib.h> #include <string.h> #include<iostream> using namespace std; typedef int InfoType; #define MAXV 100 //最大顶点个数 #define INF 32767 //INF表示∞ #define isLetter(a) ((((a)>='a')&&((a)<='z')) || (((a)>='A')&&((a)<='Z'))) #define LENGTH(a) (sizeof(a)/sizeof(a[0])) //以下定义邻接矩阵类型 typedef struct { int no; //顶点编号 InfoType info; //顶点其他信息 } VertexType; //顶点类型 typedef struct //图的定义 { char vexnum[MAXV]; int edges[MAXV][MAXV]; //邻接矩阵 int n, e; //顶点数,边数 VertexType vexs[MAXV]; //存放顶点信息 } MGraph, *PGragh; //图的邻接矩阵类型 //以下定义邻接表类型 typedef struct ANode //边的节点结构类型 { int adjvex; //该边的终点位置 struct ANode *nextarc = NULL; //指向下一条边的指针 InfoType *info; //该边的相关信息,这里用于存放权值 } ArcNode; typedef int Vertex; typedef struct Vnode //邻接表头节点的类型 { Vertex data; //顶点信息 ArcNode *firstarc; //指向第一条边 } VNode; typedef VNode AdjList[MAXV]; //AdjList是邻接表类型 typedef struct { AdjList adjlist; //邻接表 int n, e; //图中顶点数n和边数e } ALGraph; //图的邻接表类型 void MatToList(MGraph *g, ALGraph *G) //将邻接矩阵g转换成邻接表G { int i, j; ArcNode *p; //G = (ALGraph *)malloc(sizeof(ALGraph)); for (i = 0; i<g->n; i++) //给邻接表中所有头节点的指针域置初值 G->adjlist[i].firstarc = NULL; for (i = 0; i<g->n; i++) //检查邻接矩阵中每个元素 for (j = g->n - 1; j >= 0; j--) if (g->edges[i][j] != 0) //存在一条边 { p = (ArcNode *)malloc(sizeof(ArcNode)); //创建一个节点*p p->adjvex = j; p->nextarc = G->adjlist[i].firstarc; //采用头插法插入*p G->adjlist[i].firstarc = p; } G->n = g->n; G->e = g->e; //return G; } void DispMat(MGraph *g) //输出邻接矩阵g { int i, j; for (i = 0; i<g->n; i++) { for (j = 0; j<g->n; j++) printf("%3d", g->edges[i][j]); printf("\n"); } } void DispAdj(ALGraph G) //输出邻接表G { int i; ArcNode *p; for (i = 0; i<G.n; i++) { p = G.adjlist[i].firstarc; printf("%3d: ",i); //cout << i << ":"; while (p != NULL) { //printf("%3d",p->adjvex); cout << p->adjvex << " "; p = p->nextarc; } printf("\n"); } } static int get_position(MGraph g, char ch) { int i; for (i = 0; i<g.n; i++) if (g.vexnum[i] == ch) return i; return -1; } //读取一个输入字符 static char read_char() { char ch; do { ch = getchar(); } while (!isLetter(ch)); return ch; } // 创建无向图 MGraph* create_graph() { char c1, c2; int vex, edge; int i, p1, p2; MGraph* pG; // 输入顶点数和边数 printf("输入顶点数和边数:"); scanf_s("%d%d", &vex, &edge); if (vex < 1 || edge < 1 || (edge >(vex * (vex - 1)))) { printf("input error: invalid parameters!\n"); return NULL; } if ((pG = (MGraph*)malloc(sizeof(MGraph))) == NULL) return NULL; memset(pG, 0, sizeof(MGraph)); // 初始化顶点数和边数 pG->n = vex; pG->e = edge; // 初始化"顶点" printf("输入各顶点名称:\n"); for (i = 0; i < pG->n; i++) { printf("vertex(%d): ", i); pG->vexnum[i] = read_char(); } // 初始化"边" for (i = 0; i < pG->e; i++) { // 读取边的起始顶点和结束顶点 printf("edge(%d):", i); c1 = read_char(); c2 = read_char(); p1 = get_position(*pG, c1); p2 = get_position(*pG, c2); if (p1 == -1 || p2 == -1) { printf("input error: invalid edge!\n"); free(pG); return NULL; } pG->edges[p1][p2] = 1; pG->edges[p2][p1] = 1; } return pG; } // 打印矩阵队列图 void print_graph(MGraph G) { int i, j; printf("Martix Graph:\n"); for (i = 0; i < G.n; i++) { for (j = 0; j < G.n; j++) printf("%d ", G.edges[i][j]); printf("\n"); } } //创建一个树的左子女,右兄弟结构 typedef struct node { int data; node *firstChild = NULL; node *nextSibling = NULL; }TreeNode, *BinTree; int visited[MAXV]; void Dfs(ALGraph G, int i, BinTree &T) { visited[i] = 1; bool first = true;//表示是否为当前节点第一个孩子 TreeNode *locat = new TreeNode;//同样是定位作用 while (G.adjlist[i].firstarc != NULL)//从此节点出发,访问邻接节点。 { if (visited[G.adjlist[i].firstarc->adjvex] == 0) { visited[G.adjlist[i].firstarc->adjvex] = 1; TreeNode *t = new TreeNode;//建立一颗小树 t->data = G.adjlist[i].firstarc->adjvex; if (first)//是当前节点第一个孩子 { T->nextSibling = t;//建立右孩子 first = false;//表示不是传进来的第一个孩子,则是孩子们的兄弟 } else { locat->nextSibling = t; } locat = t; Dfs(G, G.adjlist[i].firstarc->adjvex, t);//继续对小树找兄弟 } G.adjlist[i].firstarc = G.adjlist[i].firstarc->nextarc; } } void DFS_Traverse(ALGraph G, BinTree &T) { TreeNode *locat = new TreeNode;//此处定义一个定位指针,用来定位当前树的位置 for (int i = 1; i <= G.n; i++) { visited[i] = 0; } for (int i = 1; i <= G.n; i++) { if (visited[i] == 0) { TreeNode *t = new TreeNode;//这代表一个小树 t->data = G.adjlist[i].data; if (T == NULL) { T = t;//若树为空,建立头节点 } else { locat->nextSibling = t;//若树不空,则是森林,插入右兄弟 } locat = t;//定位至小树 Dfs(G, i, locat);//建立小树 } } } //建立图深度优先搜索森林 void DFSForest(ALGraph G, BinTree &T) { DFS_Traverse(G, T); } void Display(BinTree T) { if (T) { cout << T->data << ' '; Display(T->firstChild); Display(T->nextSibling); } } //以下主函数用作调试 int main() { //int i, j; MGraph* g, g1; ALGraph G; BinTree T; g = create_graph(); printf("\n"); printf(" 无向图G的邻接矩阵:\n"); DispMat(g); printf(" 图G的邻接矩阵转换成邻接表,顶点名称用编号表示:\n"); MatToList(g, &G); DispAdj(G); DFSForest(G, T); Display(T); system("pause"); } ``` ![图片说明](https://img-ask.csdn.net/upload/201912/02/1575290126_389001.png) 输入顶点和边的信息后,能输出邻接矩阵和邻接表,但到了生成森林这一步时就出异常了,也就是执行DFSForest(G,T)时有问题 ![图片说明](https://img-ask.csdn.net/upload/201912/02/1575290392_874129.png) 然后和同学设断点鼓捣了好一会儿发现问题貌似是出在执行函数 ``` void DFS_Traverse(ALGraph G, BinTree &T) { TreeNode *locat = new TreeNode;//此处定义一个定位指针,用来定位当前树的位置 for (int i = 1; i <= G.n; i++) { visited[i] = 0; } for (int i = 1; i <= G.n; i++) { if (visited[i] == 0) { TreeNode *t = new TreeNode;//这代表一个小树 t->data = G.adjlist[i].data; if (T == NULL) { T = t;//若树为空,建立头节点 } else { locat->nextSibling = t;//若树不空,则是森林,插入右兄弟 } locat = t;//定位至小树 Dfs(G, i, locat);//建立小树 } } } ``` 时,其中最后一个for循环上,第一次循环时执行到 Dfs(G, i, locat);时就出问题了(也不敢确定是否确实如此),若在Dfs(G, i, locat);处设置断点然后再次运行程序 ![图片说明](https://img-ask.csdn.net/upload/201912/02/1575291018_575842.png) 接着按F11逐行运行,就到了函数Dfs(): ![图片说明](https://img-ask.csdn.net/upload/201912/02/1575291186_297905.png) ![图片说明](https://img-ask.csdn.net/upload/201912/02/1575291249_977002.png)![图片说明](https://img-ask.csdn.net/upload/201912/02/1575291300_436128.png) 再按“继续”,又循环回了Dfs(G, i, locat); ![图片说明](https://img-ask.csdn.net/upload/201912/02/1575291493_99485.png) 异常大概就是在第二次循环时出现的。请教大佬们我该如何修改这个程序?谢谢
(刚学栈与队列)用栈作为数据结构,判别读入的一个以@为结束符的字符是否为回文
试用栈作为数据结构,编写一个算法判别读入的一个以@为结束符的字符序列是否为回文 #include<stdio.h> #include<queue> #include<stack> int main() { int judgement(char c[]); char*a="ababab@"; if(judgement(a)) printf("%s 是回文",a); else printf("%s 不是回文",a); } int judgement(char c[]) { SqStack S; LinkQueue Q; SElemType e1; QElemType e2; int i; InitStack(&S); InitQueue(&Q); for(i=0;c[i]!='0';i++) { Push(&S,c[i]); EnQueue(&Q,c[i]); } while(!StackEmpty(S)&& !QueueEmpty(Q)) { Pop(&S,&e1); EnQueue(&Q,&e2); if(e1!=e2) return 0; } if(StackEmpty(S)&& QueueEmpty(Q)) return 1; }
树的遍历与计数中运用队列来实现
#include<stdio.h> #include<stdlib.h> #include<malloc.h> #include<string.h> #define MAX_TREE_SIZE 100 #define TElemType int #define QElemType int #define Status int #define OVERFLOW -2 #define OK 1 #define ERROR 0 typedef struct BiTNode//结点结构 { QElemType data; int parent;//双亲位置域 }PTNode; typedef struct{//树结构 PTNode node[MAX_TREE_SIZE]; int n;//根的位置和结点数 char r; }PTree; typedef struct{//队列的链式存储 TElemType data; struct *next; }QNode,*QueuePtr; typedef struct{ QueuePtr front;//队头指针 QueuePtr rear;//队尾指针 }LinkQueue; Status InitQueue(LinkQueue Q)//构造一个空队列 { Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode)); if(!Q.front)exit(OVERFLOW); Q.front->next=NULL; return OK; } Status EnQueue(LinkQueue Q,PTree qq){//入队 QNode *pp; pp=(QueuePtr)malloc(sizeof(QNode )); if(!pp) exit(OVERFLOW); pp->data=qq.r ; pp->next=NULL; Q.rear ->next =pp->next; Q.rear =pp; return OK; } Status DeQueue(LinkQueue Q,PTree qq){//出队 QNode *pp; if(Q.front ==Q.rear ) return ERROR; Q.front->next=pp->next ; qq.r =pp->data; Q.front->next =pp->next ; if(Q.rear ==pp) Q.rear =Q.front ; free(pp); return OK; } Status QueueEmpty(LinkQueue Q){ if(Q.rear ==Q.front ) return OK; else return ERROR; } void ClearTree(PTree *T)//构造空树 { T->n=0; } void CreateTree(PTree *T)//构造树 { LinkQueue Q; PTree p,qq; int i,j,l; // qq=(PTree )malloc(sizeof(PTNode )); char c[MAX_TREE_SIZE];/* 临时存放孩子结点数组 */ InitQueue(Q);/* 初始化队列 */ printf("请输入根结点(字符型,空格为空):"); scanf("%c%*c",&T->node[0].data);/* 根结点序号为0,%*c吃掉回车符 */ if(!T->node[0].data)/* 非空树 */ { T->node[0].parent=-1;/* 根结点无双亲 */ qq.r=T->node[0].data; qq.n=0; EnQueue(Q,qq);/* 入队此结点 */ while(i<MAX_TREE_SIZE&&QueueEmpty(Q))/* 数组未满且队不空 */ { DeQueue(Q,qq); /* 出队一个结点 */ printf("请按长幼顺序输入结点%c的所有孩子: ",qq.r); gets(c); l=strlen(c); for(j=0;j<l;j++) { T->node[i].data=c[j]; T->node[i].parent=qq.n; p.r=c[j]; p.n=i; EnQueue(Q,p); /* 入队此结点 */ i++; } } if(i>MAX_TREE_SIZE) { printf("结点数超过数组容量\n"); exit(OVERFLOW); } T->n=i; } else T->n=0; } //===== 判断树是否为空 ===== //<source lang="c"> //Status TreeEmpty(PTree *T) //{ /* 初始条件:树T存在。操作结果:若T为空树,则返回TRUE,否则返回FALSE */ // return T->n==0; //} void main(){ PTree *T1; T1=(PTree *)malloc(sizeof(PTNode )); ClearTree(T1); CreateTree(T1); } 只写了这么一点,运行起有错,,求破,,
java如何通过jms的方式连接到RabbitMQ
求助大神,想通过jms的方式连接到RabbitMQ,但是连接工厂和队列的jdni连接字符串不知道怎么写,网上搜了一段时间也没有找到正确的方式。 这是ActiveMQ的连接字符串: #jmsc("queue_download_xnkg", "org.apache.activemq.jndi.ActiveMQInitialContextFactory", "tcp://192.168.10.23:61616", "ConnectionFactory", "dynamicQueues/testquequename", false, "admin", "admin") 其中"org.apache.activemq.jndi.ActiveMQInitialContextFactory"为连接类; "tcp://192.168.10.23:61616"为连接地址; "ConnectionFactory"为连接工厂的jndi字符串; "dynamicQueues/testquequename"为连接队列的jndi字符串; 其余为账号密码。想得到类似的对应RabbitMQ的连接字符串。
实现一个简单的链表,有以下要求。
1. 请用户输入任意字符串, 以换行分隔. 2. 输入Q或q再按回车则停止输入阶段, 开始输出. 3. 将刚才输入的字符串按照顺序依次打印出来. 4. 要求: 每行字符串用一个链表节点来存储, 用队列来存储所有节点, 输入字符串时执行入队操作, 打印字符串时执行出队操作
Linux 回调函数与线程共同访问全局变量,但结果不一样,太诡异了
``` #include "stdio.h" #include <stdlib.h> #include <unistd.h> #include <iostream> #include "CommonUtils.h" #include "address.h" #include "tcpserver.h" #include "httpserver.h" #include "httprequest.h" #include "httpresponse.h" #include "httpconnection.h" using namespace std; using namespace tnet; using namespace std::placeholders; //==================================================================// //全局变量 std::vector<string> vecMessageQueque; volatile int g_iVarTest = 0; pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; //==================================================================// void onHandler(const HttpConnectionPtr_t& conn, const HttpRequest& request) { printf("HTTP接收数据:%s\n" , request.body.c_str()); g_iVarTest += 1; printf("变量值地址:%d\n" , g_iVarTest); //=============================================================// //构造应答 HttpResponse resp; resp.statusCode = 200; resp.setContentType("text/html"); resp.setKeepAlive(true); resp.enableDate(); resp.body.append("recvdata: success"); //json字符串 conn->send(resp); //=============================================================// } //消息队列调度线程 void* MessageProcThread(void* lpParameter) { int i = 0; char buffer[1024]; while (true) { printf("消息处理数量:%d\n" , g_iVarTest); sleep(1); } } //消息队列调度线程 void* HttpServiceThread(void* lpParameter) { TcpServer s; HttpServer httpd(&s); printf("HTTP服务启动正常...\n"); httpd.setHttpCallback("/service/", std::bind(&onHandler, _1, _2)); httpd.listen(Address(11181)); s.start(4); } int main() { //创建消息处理线程 //========================================================// //传入的时候必须强制转换为void* 类型,即无类型指针 pthread_t hMsgProcThread; pthread_create(&hMsgProcThread, NULL, MessageProcThread, NULL); //测试http服务 //========================================================// pthread_t hHttpServiceThread; pthread_create(&hHttpServiceThread, NULL, HttpServiceThread, NULL); //========================================================// while (true ) { char ch = getchar(); if (ch =='#') break; } return 0; } ``` ![图片说明](https://img-ask.csdn.net/upload/201911/15/1573801102_73815.png) 代码如上,g_iVarTest这个值已经改变,MessageProcThread线程访问的结果与onHandler回调的结果不一样,求高手解答以下!
怎么用队列完成程序的先进先出,实现先来先服务分配算法,模拟实现对独占设备的分配和回收
#include<stdio.h> #include<string.h> #include<stdlib.h> #define false 0 #define true 1 #define n 4 /*宏定义,用于修改设备类型数目*/ #define m 10 /*宏定义,用于修改设备数目*/ struct /*该结构体用于定义设备类表各信息*/ { char type[10]; /*设备类型名*/ int count; /*拥有的设备总台数*/ int remain; /*现存的可用设备台数*/ int address; /*该类设备在设备表中的起始地址*/ } equiptype[n]; /*系统设备类型为n*/ struct /*该结构体用于定义设备表各信息*/ { int number; /*设备绝对编号*/ int lnumber; /*设备相对编号*/ int status; /*设备好坏状态*/ int remain; /*设备是否已被分配*/ char jobname[4]; /*占有设备的作业名*/ } equipment[m]; /*系统设备数为m*/ /**********************子函数:作业设备分配*****************************/ allocate(char *J,char *type,int cc) { int i,t,j; i=0; while(i<n&&strcmp(equiptype[i].type,type)!=0) /*查找欲申请分配的设备类型,strcmp函数用于比较equiptype[i].type与type的大小,若相等则返回0*/ i++; if(i>=n) /*若没有找到欲申请设备*/ { printf("没有找到欲分配的设备,分配失败!"); return(false); } if(equiptype[i].remain<1) /*欲申请设备现存可用台数不足*/ { printf("该类设备数量不足,分配失败!"); break; } t=equiptype[i].address; /* 取出该类设备在设备表中的起始地址赋给t*/ while(!(equipment[t].status==1 && equipment[t].remain==0)) t++; /*该设备类型起始地址加一*/ equiptype[i].remain--; /*剩余设备数减一*/ equipment[t].remain=1; /*状态改为已分配*/ strcpy(equipment[t].jobname,J);/*strcpy为字符串拷贝函数,把J中的字符串拷贝到equipment[t].jobname中*/ equipment[t].lnumber=cc; /*设备相对号写入cc*/ } /**********************子函数:作业设备回收*****************************/ reclaim(char *J,char *type) { int i,t,j,k,nn; i=0; while(i<n&&strcmp(equiptype[i].type,type)!=0) /*查找欲申请归还的设备类型,strcmp函数用于比较equiptype[i].type与type的大小,若相等则返回0*/ i++; if(i>=n) /*若没有找到该类设备*/ { printf("无该类设备,设备回收失败!"); return(false); } t=equiptype[i].address; /*取出该类设备在设备表中的起始地址赋给t*/ j=equiptype[i].count; /*取出该类设备的数量赋给j*/ k=0; nn=t+j; for(;t<nn;t++) if(strcmp(equipment[t].jobname,J)==0&&equipment[t].remain==1) /*若占用某个设备的作业与欲回收的作业相同且状态为已分配*/ { equipment[t].remain=0; /*则将其状态改为未分配*/ k++; /*回收设备计数*/ } equiptype[i].remain= equiptype[i].remain+k; /*该类设备剩余设备数加k*/ if(k==0) /*若回收设备计数值k为0,*/ printf("本作业没有占用这类资源!/n"); } /**********************主函数*****************************/ void main( ) { char J[4]; int i,mm,a; char type[10]; printf("设备类初始化\n "); strcpy(equiptype[0].type,"a"); equiptype[0].count=3; equiptype[0].remain=3; equiptype[0].address=0; strcpy(equiptype[1].type,"b"); equiptype[1].count=2; equiptype[1].remain=2; equiptype[1].address=3; strcpy(equiptype[2].type,"c"); equiptype[2].count=4; equiptype[2].remain=4; equiptype[2].address=5; strcpy(equiptype[3].type,"d"); equiptype[3].count=1; equiptype[3].remain=1; equiptype[3].address=9; for(i=0;i<10;i++) /*初始化设备表*/ { equipment[i].number=i; equipment[i].status=1; equipment[i].remain=0; } while(1) { printf("\n0-退出,1-分配,2-回收,3-显示"); /*功能选择界面*/ printf("\n请选择功能(0-3):"); scanf("%d",&a); switch(a) { case 0 : /*a=0程序结束*/ exit(0); case 1 : /*a=1分配设备*/ for(i=0;i<3;i++) /*输入设备类表初始信息*/ { printf("请输入作业名、作业所需设备类型和设备相对号\n"); scanf("%s%s%d",J,type,&mm); printf("请输入作业名、作业所需设备类型和设备相对号\n"); scanf("%s%s%d",J,type,&mm); printf("请输入作业名、作业所需设备类型和设备相对号\n"); scanf("%s%s%d",J,type,&mm); } allocate(J,type,mm); /*分配设备*/ break; case 2: /*a=2回收设备*/ printf("请输入作业名和作业归还的设备类\n"); scanf("%s%s",J,type); /*输入要回收的作业名及对应的设备类*/ reclaim(J,type); /*回收设备*/ break; case 3: /*a=3 输出设备类表和设备表的内容*/ printf("输出设备类表!\n"); /*输出设备类表内容*/ printf(" 设备类型 设备总量 空闲好设备 起始地址\n"); for(i=0;i<n;i++) printf("%9s%16d%22d%14d\n",equiptype[i].type,equiptype[i].count,equiptype[i].remain,equiptype[i].address); printf("输出设备表:\n"); /*输出设备表内容*/ printf("绝对号 好/坏 已/未分配 占用作业名 相对号\n"); for(i=0;i<m;i++) printf("%3d%11d%15d%15s%9d\n",equipment[i].number,equipment[i].status,equipment[i].remain,equipment[i].jobname,equipment[i].lnumber); } } }
C++编程 男孩女孩排位问题 要求用递归算法
描述 在幼儿园中,老师安排小朋友做一个排队的游戏。首先老师精心的把数目相同的小男孩和小女孩编排在一个队列中,每个小孩按其在队列中的位置发给一个编号(编 号从0开始)。然后老师告诉小朋友们,站在前边的小男孩可以和他后边相邻的小女孩手拉手离开队列,剩余的小朋友重新站拢,再按前后相邻的小男孩小女孩手拉 手离开队列游戏,如此往复。由于教师精心的安排,恰好可以保证每两个小朋友都能手拉手离开队列,并且最后离开的两个小朋友是编号最小的和最大的两个小朋 友。(注:只有小男孩在前,小女孩在后,且他们两之间没有其他的小朋友,他们才能手拉手离开队列)。请根据老师的排队,按小女孩编号从小到大的顺序,给出 所有手拉手离开队列的小男孩和小女孩的编号对。 输入 用一个字符串代表小朋友队列。字符串中只会出现两个字符(样例输入里用的是 括号但实际数据则不一定),分别代表小男孩和小女孩,首先出现的字符代表小男孩,另一个字符代表小女孩。小孩总数不超过100 输出 按小女孩编号顺序,顺序输出手拉手离开队列的小男孩和小女孩的编号对,每行一对编号,编号之间用一个空格分隔。 样例输入  1 ((()(())())(())) 样例输出  1 2 3 4 5 6 7 8 2 3 5 6 4 7 8 9 1 10 12 13 11 14 0 15 求详细解答 需要用递归求解
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、PDF搜索网站推荐 对于大部
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 顺便拉下票,我在参加csdn博客之星竞选,欢迎投票支持,每个QQ或者微信每天都可以投5票,扫二维码即可,http://m234140.nofollow.ax.
Vue + Spring Boot 项目实战(十四):用户认证方案与完善的访问拦截
本篇文章主要讲解 token、session 等用户认证方案的区别并分析常见误区,以及如何通过前后端的配合实现完善的访问拦截,为下一步权限控制的实现打下基础。
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入  假设现有4个人
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 欢迎 改进 留言。 演示地点跳到演示地点 html代码如下`&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;music&lt;/title&gt; &lt;meta charset="utf-8"&gt
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。 1. for - else 什么?不是 if 和 else 才
数据库优化 - SQL优化
前面一篇文章从实例的角度进行数据库优化,通过配置一些参数让数据库性能达到最优。但是一些“不好”的SQL也会导致数据库查询变慢,影响业务流程。本文从SQL角度进行数据库优化,提升SQL运行效率。 判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断: 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 c/c++ 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7
通俗易懂地给女朋友讲:线程池的内部原理
餐厅的约会 餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”我楞了一下,心里想女朋友今天是怎么了,怎么突然问出这么专业的问题,但做为一个专业人士在女朋友面前也不能露怯啊,想了一下便说:“我先给你讲讲我前同事老王的故事吧!” 大龄程序员老王 老王是一个已经北漂十多年的程序员,岁数大了,加班加不动了,升迁也无望,于是拿着手里
经典算法(5)杨辉三角
写在前面: 我是 扬帆向海,这个昵称来源于我的名字以及女朋友的名字。我热爱技术、热爱开源、热爱编程。技术是开源的、知识是共享的。 这博客是对自己学习的一点点总结及记录,如果您对 Java、算法 感兴趣,可以关注我的动态,我们一起学习。 用知识改变命运,让我们的家人过上更好的生活。 目录一、杨辉三角的介绍二、杨辉三角的算法思想三、代码实现1.第一种写法2.第二种写法 一、杨辉三角的介绍 百度
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹
面试官:你连RESTful都不知道我怎么敢要你?
面试官:了解RESTful吗? 我:听说过。 面试官:那什么是RESTful? 我:就是用起来很规范,挺好的 面试官:是RESTful挺好的,还是自我感觉挺好的 我:都挺好的。 面试官:… 把门关上。 我:… 要干嘛?先关上再说。 面试官:我说出去把门关上。 我:what ?,夺门而去 文章目录01 前言02 RESTful的来源03 RESTful6大原则1. C-S架构2. 无状态3.统一的接
SQL-小白最佳入门sql查询一
一 说明 如果是初学者,建议去网上寻找安装Mysql的文章安装,以及使用navicat连接数据库,以后的示例基本是使用mysql数据库管理系统; 二 准备前提 需要建立一张学生表,列分别是id,名称,年龄,学生信息;本示例中文章篇幅原因SQL注释略; 建表语句: CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // dosho
漫话:什么是平衡(AVL)树?这应该是把AVL树讲的最好的文章了
这篇文章通过对话的形式,由浅入深带你读懂 AVL 树,看完让你保证理解 AVL 树的各种操作,如果觉得不错,别吝啬你的赞哦。 1、若它的左子树不为空,则左子树上所有的节点值都小于它的根节点值。 2、若它的右子树不为空,则右子树上所有的节点值均大于它的根节点值。 3、它的左右子树也分别可以充当为二叉查找树。 例如: 例如,我现在想要查找数值为14的节点。由于二叉查找树的特性,我们可...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,
程序员:我终于知道post和get的区别
IT界知名的程序员曾说:对于那些月薪三万以下,自称IT工程师的码农们,其实我们从来没有把他们归为我们IT工程师的队伍。他们虽然总是以IT工程师自居,但只是他们一厢情愿罢了。 此话一出,不知激起了多少(码农)程序员的愤怒,却又无可奈何,于是码农问程序员。 码农:你知道get和post请求到底有什么区别? 程序员:你看这篇就知道了。 码农:你月薪三万了? 程序员:嗯。 码农:你是怎么做到的? 程序员:
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU
开源并不是你认为的那些事
点击上方蓝字 关注我们开源之道导读所以 ————想要理清开源是什么?先要厘清开源不是什么,名正言顺是句中国的古代成语,概念本身的理解非常之重要。大部分生物多样性的起源,...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
      11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI 算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC
【技巧总结】位运算装逼指南
位算法的效率有多快我就不说,不信你可以去用 10 亿个数据模拟一下,今天给大家讲一讲位运算的一些经典例子。不过,最重要的不是看懂了这些例子就好,而是要在以后多去运用位运算这些技巧,当然,采用位运算,也是可以装逼的,不信,你往下看。我会从最简单的讲起,一道比一道难度递增,不过居然是讲技巧,那么也不会太难,相信你分分钟看懂。 判断奇偶数 判断一个数是基于还是偶数,相信很多人都做过,一般的做法的代码如下
《C++ Primer》学习笔记(六):C++模块设计——函数
专栏C++学习笔记 《C++ Primer》学习笔记/习题答案 总目录 https://blog.csdn.net/TeFuirnever/article/details/100700212 —————————————————————————————————————————————————————— 《C++ Primer》习题参考答案:第6章 - C++模块设计——函数 文章目录专栏C+...
8年经验面试官详解 Java 面试秘诀
    作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。   Java程序员准备和投递简历的实
面试官如何考察你的思维方式?
1.两种思维方式在求职面试中,经常会考察这种问题:北京有多少量特斯拉汽车? 某胡同口的煎饼摊一年能卖出多少个煎饼? 深圳有多少个产品经理? 一辆公交车里能装下多少个乒乓球? 一
so easy! 10行代码写个"狗屁不通"文章生成器
前几天,GitHub 有个开源项目特别火,只要输入标题就可以生成一篇长长的文章。背后实现代码一定很复杂吧,里面一定有很多高深莫测的机器学习等复杂算法不过,当我看了源代码之后这程序不到50
知乎高赞:中国有什么拿得出手的开源软件产品?(整理自本人原创回答)
知乎高赞:中国有什么拿得出手的开源软件产品? 在知乎上,有个问题问“中国有什么拿得出手的开源软件产品(在 GitHub 等社区受欢迎度较好的)?” 事实上,还不少呢~ 本人于2019.7.6进行了较为全面的 回答 - Bravo Yeung,获得该问题下回答中得最高赞(236赞和1枚专业勋章),对这些受欢迎的 Github 开源项目分类整理如下: 分布式计算、云平台相关工具类 1.SkyWalk
MySQL数据库总结
文章目录一、数据库简介二、MySQL数据类型(5.5版本)三、Sql语句(1)Sql语句简介(2)数据定义语言DDLcreate,alter,drop(3)数据操纵语言DMLupdate,insert,delete(4)数据控制语言DCLgrant,revoke(5)数据查询语言DQLselect(6)分组查询与分页查询group by,limit四、完整性约束(单表)五、多表查询六、MySQL数
相关热词 c# 引用mysql c#动态加载非托管dll c# 两个表数据同步 c# 返回浮点json c# imap 链接状态 c# 漂亮字 c# 上取整 除法 c#substring c#中延时关闭 c#线段拖拉
立即提问