顺序栈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
原创粉丝点击