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;再出棧并將其入隊列,直到??諡橹埂?/p>
*/void?Reverse(SqQuene?*sq)
{
ELEMTYPE?x;
SqStack?*ss;
總結
以上是生活随笔為你收集整理的c语言行列倒置算法,循环行列的元素倒置。求指点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何查询域名备案号(备案查询中心)
- 下一篇: html+canvas实现屏幕截取(nu