1. 算法要求
设将n(n>1)个整数存放到一维数组R中,试设计一个在时间和空间两方面尽可能有效的算法,将R中保有的序列循环左移P(0﹤P﹤n)个位置,即将R中的数据由(X0 X1 ……Xn-1)变换为(Xp Xp+1 ……Xn-1 X0 X1 ……Xp-1)。
2. 算法思想
考虑使用队列来实现,将队列前面p个元素依次出队列,再从队尾部依次进队列,即可实现该算法。使用数据结构:
- typedef struct qnode{
- elemtype *base;
- int front;
- int rear;
- }sqqueue;
3. 算法实现
- int in_sqqueue(sqqueue *sq, elemtype e)
- {
- if ((sq->rear + 1) % MAXQSIZE == sq->front)
- return ERROR;
- sq->base[sq->rear] = e;
- sq->rear = (sq->rear + 1) % MAXQSIZE;
- return OK;
- }
- int out_sqqueue(sqqueue *sq, elemtype *e)
- {
- if (sq->front == sq->rear)
- return NULL_QUEUE;
- *e = sq->base[sq->front];
- sq->front = (sq->front + 1) % MAXQSIZE;
- return OK;
- }
- void circle_left_shift_queue(sqqueue *sq, int n)
- {
- int i;
- elemtype e;
- for (i=0; i<n; ++i) {
- out_sqqueue(sq, &e); /* 从队头出队 */
- in_sqqueue(sq, e); /* 再从队尾进队 */
- }
- }