怎样克隆别人的网站官网大全
怎样克隆别人的网站,官网大全,html5和php做网站,怎么在网站上做网页1.前序
又有很久没有更新文章了#xff0c;这次带你们手撕几道基础题#xff1b;真的就和康纳吃饭一样简单#xff01;#xff01;#xff01;
如果还不会队列和栈的可以去看看之前写的博客#xff1b; 栈的实现 队列概念以及实现 - 快速传送 目录
1.前序 …1.前序
又有很久没有更新文章了这次带你们手撕几道基础题真的就和康纳吃饭一样简单
如果还不会队列和栈的可以去看看之前写的博客 栈的实现 队列概念以及实现 - 快速传送 目录
1.前序
2.括号匹配问题有效的括号 - 快速传送
3.用队列实现栈 - 快速传送
3.1 核心思路
3.2代码部分上面是思路
4.用栈实现队列 - 快速跳转
4.1这里用c语言实现的所以要复制一个栈
5.带环队列 - 快速跳转 2.括号匹配问题有效的括号 - 快速传送
核心思路 一定是左括号入栈右括号在外面入完数据尝试匹配不相等 可以如果相等可以走到最后返回true左括号有数据右括号没数据此时说明返回false右括号有数据左括号没有右括号还有没匹配的此时*s有数据进了循环if判断栈为NULL此时为false 根据上图分析有4种情况第一步建立循环有数据就往下读取左括号入栈右括号不如栈进入的数据拿去比对先处理正常情况没有进入到if判断(不匹配的情况),此时就可以证明时匹配上了因为没有返回false注意不匹配的情况当满足左括号和右括号对应的时候此时就可以不会进if
bool isValid(char* s) {ST str;STInit(str);while(*s)//有数据就继续读{if(*s ( || *s { || *s [)//是左括号就入栈{STPush(str,*s);}else//尝试和右括号匹配{//为 0 时返回 true然后执行if返回false匹配失败if(STEmpty(str))//经过前面的匹配后此时栈为NULL了但是*s 还有数据{STDestroy(str);return false;}char top STTop(str);//不管取没取到先Pop如果匹配成功就正常往下走STPop(str);//不匹配的情况不匹配直接返回if(top ( *s ! ) ||top [ *s ! ] ||top { *s ! }){//销毁空间并返回STDestroy(str);return false;}}s;//找下一个元素}//返回值为false说明有栈内有数据但是前面while已经结束没有字符可以匹配了//意味着左括号比右括号的多 只要不匹配就返回falsebool ret STEmpty(str);STDestroy(str);return ret;//正常返回
}
3.用队列实现栈 - 快速传送
传参部分要注意这个MyStack结构体里装着两个队列这里要传(que-q1)或者que-q1因为这是两个结构体改变结构体需要结构体指针Create部分首先需要给MyStack(匿名结构体)开辟空间这里他让我们初始化两个队列并且完成初始化这部分就直接调用函数即可。
3.1 核心思路
核心思路插入数据时始终插入到有数据的队列去始终要空出一个队列用来删除 Push实现栈的后进后出第一次开始数据随便放后面插入数据要放到有数据后 QueueEmpty这个函数为NULL返回true(表示没有数据)反之返回false说明此时有数据注意取反将结果取反此代码中有数据返回false取反后得到truePop这里利用假设法先假设q1有数据假设失败那就是q2这里的if判断同样用判空来判断是否有数据 这里while里面就是挪动数据了 此时你需要取到头元素挪动size - 1个数据留一个在que1里面pop掉就模拟了栈的出栈QueuePop(NoEmpty);//只是被导到Empty原空间还有数据所以要Pop掉已经导过去的数据这里根据题目要求要保存数据然后要pop掉这块空间最后返回该值 Top,取栈的top元素也就是队列的尾元素当然这个尾元素也是需要看数据在哪一边同样的配方判NULLEmpty栈的判NULL竟然是由两个队列组成自然也就需要两个都为NULL才行 也是运算符同时为NULL返回true这里的free要了解结构体开始初始化是什么你就怎么销毁这里销毁时候先后顺序的不能直接销毁obj而是要先销毁obj里面两个的q1和q2才行 3.2代码部分上面是思路
typedef struct {Queue q1;Queue q2;
} MyStack;MyStack* myStackCreate() {MyStack* que (MyStack*)malloc(sizeof(MyStack));QueueInit((que-q1));//通过结构体指针访问到q1用初始化函数直接初始化QueueInit((que-q2));return que;
}void myStackPush(MyStack* obj, int x) {//obj 是装着q1 和 q2两个结构体的//分为两种情况那个后面有数据有往哪里放都没有随便放一个if(!QueueEmpty((obj-q1)))//如果q1这个队列有数据返回false! 取反后true执行if{QueuePush((obj-q1),x);}//obj-q2有数据或者都没有else{QueuePush((obj-q2),x);}
}
int myStackPop(MyStack* obj) {//假设法,因为当一方成立是双方代码一样Queue* Empty (obj-q1);//假设p1没数据 Queue* NoEmpty (obj-q2);//有数据if(!QueueEmpty((obj-q1)))//非NULL有数据;假设失败{Empty (obj-q2);NoEmpty (obj-q1);}while(QueueSize(NoEmpty) 1)//有数据的一方需要导到无数据的一方个数size - 1{QueuePush(Empty,QueueFront(NoEmpty));//取到有数据的队头导到无数据的一方QueuePop(NoEmpty);//只是被导到Empty原空间还有数据所以要Pop掉已经导过去的数据}QuDataType ret QueueFront(NoEmpty);QueuePop(NoEmpty);return ret;
}int myStackTop(MyStack* obj) {if(!QueueEmpty((obj-q1)))//此时q1有数据,直接取到队列的队尾{return QueueBack((obj-q1));}else{return QueueBack((obj-q2));}
}bool myStackEmpty(MyStack* obj) {
//只有这两个队列同时为NULL才说明没数据了;满足两个判空都为NULL才会返回true也相当于是运算符return QueueEmpty((obj-q1)) QueueEmpty((obj-q2));
}void myStackFree(MyStack* obj) {QueueDestroy((obj-q1));//首先要free掉q1和q2 这两个队列然后才是objQueueDestroy((obj-q2));free(obj);
}
4.用栈实现队列 - 快速跳转
此题创建两个栈来实现stpush只入数据相当于入队stpop只出数据相当于出队Create首先是初始化MyQueue 里面放上两个栈栈也初始化Pushpush数据那么调用栈的push函数即可注意STPush只用来放数据Peek返回开头元素把数据都导到stpop这样刚好压栈的元素就在栈顶 要让这里的stpop没有数据才能导入进去只要stpop有数据就不要进因为要始终保持队列的先进先出假如stpush的数据导过来不就乱了如果没进if说明有数据那就不要导到stpop了这里用动图说明原因只有stpop数据出完才进数据 Pop删除队列开头的数据并返回元素这里为什么调用一下myQueuePeek函数呢 因为我们拿数据始终在stpop拿那么stpop没数据自然要导有了数据直接取头元素删除返回即可Empty判断是为NULL因为这个是模拟是队列的功能所以两个都要为NULLFree怎么申请的空间怎么倒着销毁和队列实现栈的销毁逻辑一样
4.1这里用c语言实现的所以要复制一个栈
typedef struct {ST stpush;//入队ST stpop;//出队
} MyQueue;MyQueue* myQueueCreate() {MyQueue* obj (MyQueue*)malloc(sizeof(MyQueue));STInit((obj-stpush));STInit((obj-stpop));return obj;
}void myQueuePush(MyQueue* obj, int x) {STPush((obj-stpush),x);//stpush只入数据
}int myQueuePeek(MyQueue* obj) {if(STEmpty((obj-stpop)))//pop这边栈没数据就要导入数据{while(!STEmpty((obj-stpush)))//push有数据就到导{int top STTop((obj-stpush));STPush((obj-stpop),top);STPop((obj-stpush));//数据挪到那边就要删除了}}return STTop((obj-stpop));
}
int myQueuePop(MyQueue* obj) {int front myQueuePeek(obj);//stpop这边有数据才能删如果不用调整刚好也拿到了STPop((obj-stpop));return front;
}bool myQueueEmpty(MyQueue* obj) {return STEmpty((obj-stpush)) STEmpty((obj-stpop));//两个都为NULL才为NULL
}void myQueueFree(MyQueue* obj) {STDestroy((obj-stpush));STDestroy((obj-stpop));free(obj);
}
5.带环队列 - 快速跳转
Create这个部分就是初始化了需要开辟两个空间一个是MyCircularQueue结构体的另外一个就是arr 数组的IsEmpty判NULL 多开一块空间的意义是防止head tail时不知道是满还是NULLIsFull判满 EnQueue向循环队列插入一个元素在开始之前肯定要判断是否为满满了就不能插入了 DeQueue从循环队列中删除一个元素在开始之前要判NULL不然你删个屁 Front开始之前肯定要判NULLhead位置的数据没啥问题直接取到就行特殊情况在tail因为指向下一个Rear取尾的数据普通情况正常取特殊情况就是有效数据正好是最后一个当tail指向下一个位置(也就是下标0) typedef struct {int* arr;int head;int tail;int k;
} MyCircularQueue;MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue* Cqueue (MyCircularQueue*)malloc(sizeof(MyCircularQueue));if(Cqueue NULL){perror(malloc Cqueuq);return 0;}//多开辟一个空间防止假溢出,这里不需要临时变量也和数据丢不丢是没关系Cqueue-arr (int*)malloc(sizeof(int) * (k 1));Cqueue-head Cqueue-tail 0;//刚开始都指向下标0Cqueue-k k;return Cqueue;
}
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return obj-head obj-tail;//判断当前存储的位置是否为NULL
}bool myCircularQueueIsFull(MyCircularQueue* obj) {return ((obj-tail 1) % (obj-k 1)) obj-head;//满了返回true
}bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {if(myCircularQueueIsFull(obj))//判满return false;obj-arr[obj-tail] value;obj-tail;obj-tail % (obj-k 1);return true;
}bool myCircularQueueDeQueue(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))//判NULLreturn false;obj-head;obj-head % (obj-k 1);return true;
}int myCircularQueueFront(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return -1;elsereturn obj-arr[obj-head];//取当前数据
}int myCircularQueueRear(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return -1;elsereturn obj-arr[(obj-tail - 1 obj-k 1) % (obj-k 1)];
}void myCircularQueueFree(MyCircularQueue* obj) {free(obj-arr);free(obj);
}
free空间的销毁就是怎么申请怎么销毁假如先申请的obj后申请的obj-arr;那么就反着销毁
总结
最近改变了一下学习方式上完课要及时写作业而且要独立完成效果最好反正都这么菜了多进步一点也算好的总之不能止步不前
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/86165.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!