c语言行列倒置算法,循环行列的元素倒置。求指点

循环队列的元素倒置。求指点。

本帖最后由 whdugh 于 2013-01-30 12:29:48 编辑

编写一个算法,将一个循环队列(容量为n,元素下标从1~n)的元素倒置。

/*

算法思想: 使用一个栈起到过渡作用。先将sq队列中元素出队并将其入栈ss,直到队列空为止;

然后初始化队列,将sq->front=sq->rear=n;再出栈并将其入队列,直到栈空为止。

*/void Reverse(SqQuene *sq)

{

ELEMTYPE x;

SqStack *ss;

ss = (SqStack *)malloc(sizeof(SqStack)); //栈初始化

ss->top = -1;

while(sq->front != sq->rear)             //队不空时,出队并入栈

{

sq->front = (sq->front + 1) % MAXSIZE;

if(sq->front == 0)                    //队列元素下标从1到n

sq->front = n;   //dgh  n 这里是什么意思  front和rear 指向的位置变化了?

x = sq->data[sq->front];

ss->top++;

ss->data[ss->top] = x;                //将x入栈

}                                         /*sq栈中从栈顶到栈底的元素为f,e,d,c,b,a*/

sq->front = sq->rear = n;                 /*队列初始化 为何初始化为n*/  ?

while(ss->top >= 0)                       /*栈不空时,出栈并将元素入队 */

{

x = ss->data[ss->top];

ss->top--;

sq->rear = (sq->rear + 1) % n;

sq->data[sq->rear] = x;

}

}

有两个问题:1.为什么要在第一个循环里面加if判断语句 if(sq->front==0),然后赋为n?

2.将sq->front=sq->rear=n,这又是为何?菜鸟刚自学数据结构 求高手指点 谢谢

循环队列

------解决方案--------------------

这个程序应该有一个隐含条件:

第一个while循环之前,应该是sq->front = 0; sq->rear = n;

楼主的问题:

1. sq->front = (sq->front + 1) % MAXSIZE;这句的含义就是队头指针顺序后移,直到队尾

MAXSIZE应该是n,那么当sq->front = n - 1的时候,经过这句赋值,sq->front就成了0, 而此时

n - 1的下一个元素应该是n;所以有下面的if判断语句。

2. 经过上一个循环,实际上已经满足sq->front=sq->rear=n,所以此处是多此一举。

这句的作用是为后面把栈中的元素弹出到原队列中作初始化,为n是因为循环中会先进行下标移动,再进行数据处理, (n + 1) % n 就是 1 了。

整个程序就是利用了栈先入后出的性质实现逆序。

个人认为程序改为这样比较合适:

/*

算法思想: 使用一个栈起到过渡作用。先将sq队列中元素出队并将其入栈ss,直到队列空为止;

然后初始化队列,将sq->front=sq->rear=n;再出栈并将其入队列,直到栈空为止。

*/void Reverse(SqQuene *sq)

{

ELEMTYPE x;

SqStack *ss;

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值