队列实现对有n个元素的数组循环左移k位

来源:互联网 发布:非线性优化算法 编辑:程序博客网 时间:2024/04/30 11:26

基本思想:利用队列求解将使问题简单化,将数组的0-(k-1)存入队列,然后将数组k-(n-1)依次左移k位,然后顺序出列,具体算法如下:

#include<stdio.h>#include<stdlib.h>#define MAXSIZE 100typedef struct {int data[MAXSIZE];int front,rear;}SeqQueue,*PSeqQueue;PSeqQueue Init_SeqQueue(){//创建一个队列PSeqQueue Q;Q=(PSeqQueue)malloc(sizeof(SeqQueue));if(Q){Q->front=0;Q->rear=0;}return Q;}int Empty_SeqQueue(PSeqQueue Q){//   if(Q&&Q->front==Q->rear)   return 1;   else   return 0;}int In_SeqQueue(PSeqQueue Q,int x){//进队操作if((Q->rear+1)%MAXSIZE==Q->front){printf("队满!");return 0;}else{Q->rear=(Q->rear+1)%MAXSIZE;Q->data[Q->rear]=x;return 1;}}int Out_SeqQueue(PSeqQueue Q,int *x){//出队操作if(Empty_SeqQueue(Q)){printf("队空!");return 0;}else{Q->front=(Q->front+1)%MAXSIZE;*x=Q->data[Q->front];return 0;}}int Front_SeqQueue(PSeqQueue Q,int *x){//取队头元素if(Q->front==Q->rear){printf("队空!");return -1;}else{*x=Q->data[Q->front+1]%MAXSIZE;return 1;}}void Destroy_SeqQueue(PSeqQueue *Q){//销毁队列if(*Q)free(*Q);*Q=NULL;}void Array_left_move(int a[],int n,int k){//左移k位int i;PSeqQueue Q;Q=Init_SeqQueue();for(i=0;i<k;i++)In_SeqQueue(Q,a[i]);//0到k-1的元素入队列for(i=k;i<n;i++)a[i-k]=a[i];//k到n-1的元素左移k位i=n-k;//i移动到n-k位while(!Empty_SeqQueue(Q)){Out_SeqQueue(Q,&a[i]);//元素出队列,插入n-k到n-1的位置++i;}}int main(){int a[100],i,j;int n,k;printf("请输入要对多少个元素进行移动:");scanf("%d",&n);printf("请一次输入这%d个元素:",n);for(i=0;i<n;i++)scanf("%d",&a[i]);printf("请问要左移多少位:");     scanf("%d",&j);Array_left_move(a,n,j);printf("移动后的数组为:");for(i=0;i<n;i++)printf("%d ",a[i]);return 0;}