顺序栈S中有2n个元素,从栈顶到栈底的元素依次为a2n、a2n-1、…、a1。试设计一个算法:通过一个循环队列重新排列该栈中的元素,使得从栈顶到栈底的元素先偶数,后奇数
来源:互联网 发布:unity3d 调用 so 编辑:程序博客网 时间:2024/04/29 16:45
#include<stdio.h>#include<math.h>#define STACK_INIT_SIZE 100#define QUEUE_MAX_SIZE 100#define STACK_INCREMENT 10using namespace std;typedef struct Stack //结构体定义{int *elem; //数据域int top; //顺序栈栈顶int stacksize; //顺序栈当前长度}Stack;typedef struct Sqqueue //循环队列结构体定义{int *data;int front;int rear;}Sqqueue;//公共函数声明void Error(char *s); //错误处理函数void Reset(); //重置函数//顺序栈函数声明Stack Creat_Stack(); //若干个元素的顺序栈void Destroy_Stack(Stack & l); //销毁顺序栈void Push_Stack(Stack &L, int e); //压栈操作函数int Pop_Stack(Stack &L, int e); //出栈操作函数void Increment_Stack(Stack & l); //增加顺序栈空间函数void Print_Stack(Stack & l); //输出顺序栈元素函数、//循环队列函数声明 void Init_Sqqueue(Sqqueue &q); //初始化循环队列void Destroy_Sqqueue(Sqqueue &q);//销毁循环队列函数void En_Sqqueue(Sqqueue &q, int e);//入队操作int De_Sqqueue(Sqqueue &q, int e);//出队操作void Print_Sqqueue(Sqqueue &q);//以此输出循环队列的值//顺序栈函数定义Stack Creat_Stack(){int length = 0;int data = 0;Stack l;l.elem = new int[STACK_INIT_SIZE];if (!l.elem)Error("内存申请失败!");l.top = -1;l.stacksize = STACK_INIT_SIZE;cout << "请输入顺序栈长度:";cin >> length;cout << "请输入顺序栈元素内容:" << endl;for (int i = 0; i < length; i++){cin >> data;l.elem[i] = data; //这一步是重点l.top++;}cout << "顺序栈创建成功!" << endl;return l;}void Destroy_Stack(Stack &l){delete[] l.elem;l.top = -1;l.stacksize = 0;cout << "该顺序栈销毁成功!" << endl;}void Increment_Stack(Stack &l){int *newstack = new int[l.stacksize + STACK_INCREMENT];if (!newstack)Error("存储分配失败!");for (int i = 0; i < l.top; i++){newstack[i] = l.elem[i];}l.elem = newstack;delete[] l.elem;l.stacksize += STACK_INCREMENT;}void Push_Stack(Stack &l, int e){if (l.top == (l.stacksize - 1))Increment_Stack(l);l.elem[++l.top] = e;}int Pop_Stack(Stack &l, int e){if (l.top == -1)Error("该顺序栈为空栈!");return e = l.elem[l.top--];}void Print_Stack(Stack &l){cout << "该顺序栈的元素是:" << endl;for (int i = l.top; i > -1; i--){cout << l.elem[i] << " ";}cout << endl;}//循环队列函数定义void Init_Sqqueue(Sqqueue &q){q.data = new int[QUEUE_MAX_SIZE];if (!q.data)Error("存储分配失败!");q.front = q.rear = 0;}void Destroy_Sqqueue(Sqqueue &q){delete[] q.data;q.front = q.rear = 0;cout << "该循环队列销毁成功!";}void En_Sqqueue(Sqqueue &q, int e){if (((q.rear + 1) % QUEUE_MAX_SIZE) == q.front)Error("该循环队列已满!");q.data[q.rear] = e;q.rear = (q.rear + 1) % QUEUE_MAX_SIZE;}int De_Sqqueue(Sqqueue &q, int e){if (q.front == q.rear)Error("该循环队列为空队列!");e = q.data[q.front];q.front = (q.front + 1) % QUEUE_MAX_SIZE;return e;}void Print_Sqqueue(Sqqueue &q){cout << "该循环队列的元素是:";while (q.front != q.rear){cout << q.data[q.front] << " ";q.front = (q.front + 1) % QUEUE_MAX_SIZE;}cout << endl;}//公共函数定义void Error(char *s){cout << s << endl;exit(1);}void Reset() {Stack s;Sqqueue q;int e = 0;int i = 0;int n = 10;//此处可以修改,这里只是简单操作而已,且应该与顺序栈的长度一致int temp = 0;Init_Sqqueue(q);s = Creat_Stack();for (i = 0; i < n; i++){temp = Pop_Stack(s, e);En_Sqqueue(q, temp); //将出栈后的元素以此入队}//Print_Sqqueue(q);for (i = 0; i < n; i++){temp=De_Sqqueue(q, e); if (temp % 2 == 0) //判断是否为偶数En_Sqqueue(q, temp); //若是偶数,再次入队elsePush_Stack(s, temp); //若是奇数,再次入栈}for (i = 0; i < n / 2; i++){En_Sqqueue(q, Pop_Stack(s, e));//将奇数出栈入队,现在队列中有全部元素}for (i = 0; i < n / 2; i++){Push_Stack(s, De_Sqqueue(q, e));//将偶数出队入栈,此时队列中只剩奇数}for (i = 0; i < n / 2; i++){En_Sqqueue(q, Pop_Stack(s, e));//将偶数出栈入队,此时队列中有所有元素}for (i = 0; i < n; i++){Push_Stack(s, De_Sqqueue(q, e));//将所有元素出队入栈,此时队列中有所有元素}Print_Stack(s);}int main(){Reset();return 0;}
0 0
- 顺序栈S中有2n个元素,从栈顶到栈底的元素依次为a2n、a2n-1、…、a1。试设计一个算法:通过一个循环队列重新排列该栈中的元素,使得从栈顶到栈底的元素先偶数,后奇数
- 设计一个算法,删除一个顺序表中从第i个元素开始的k个元素。
- 试设计一个算法,删除一个顺序表从第i个元素开始的k个元素
- 获得一个2n数组中的N个元素,使得该N个元素与剩余元素和最小
- 给定一个整数sum, 从有N个有序元素的数组中寻找元素a,b,使得a+b的结果最接近sum
- 设计一个算法,从顺序表中删除所有值为x的元素
- 从n个元素中选取第k大的元素,设计一个算法并说明算法复杂度
- 从一个队列中取出一个元素再放回去同时保持原来的顺序,不申请非必需的空间存储队列中的元素
- 约瑟夫环:用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至最后一个元素并输出该元素的值
- 用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至最后一个元素并输出该元素的值
- 第十四周项目一数组大折腾(1)创建一个有20个元素的整型数组,通过初始化,为数组中的前10个元素赋初值,然后通过键盘输入后10个元素的值,从前往后输出数组中元素的值,每五个元素
- 给定一个整数sum,从有N个无序元素的数组中寻找元素a、b、c、d,使得 a+b+c+d =sum,最快的平均时间复杂度是____。
- 给你一个长度为N的链表。N很大,但你不知道N有多大。你的任务是从这N个元素中随机取出k个元素
- 有十个数按从大到小的顺序存放在一个数组中,输入一个数,要求找出该数是数组中的第几个元素。如果该数不在数组中,则打印出“无此数”
- [原创]关于a1,a2,a3,...,an共n个元素依次入栈其可能出栈的排列数的计算
- 递归方法从m个元素中取出n个元素的算法 ------分析
- 编号为 1 到 n 的 n 个元素,顺序的进入一个栈,则可能的出栈序列有多少种?[摘]
- 编号为 1 到 n 的 n 个元素,顺序的进入一个栈,则可能的出栈序列有多少种?
- ubuntu配置常用
- HDU 2845 Beans
- win搭建git服务器
- 实现ES5以下兼容,Object.create()、getElementsByClassName()
- COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件失败,原因是出现以下错误: 80070005 拒绝访问。
- 顺序栈S中有2n个元素,从栈顶到栈底的元素依次为a2n、a2n-1、…、a1。试设计一个算法:通过一个循环队列重新排列该栈中的元素,使得从栈顶到栈底的元素先偶数,后奇数
- maven插件编写与调试
- 解决ListView在ScrollView中滑动冲突
- 使用PHP创建一个REST API(Create a REST API with PHP)
- 语言基础——Java_selectSort & bubbleSort
- 教你如何查看一款App里面所包含的图片
- 高仿京东APP首页“京东快报”自动向上滚动的广告条
- hdoj 1878 欧拉回路 (并查集+欧拉)
- 解决软键盘对fixed的影响