| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1139 人关注过本帖
标题:环形队列的转置,不知在哪里出错了?求大神指点迷津!
只看楼主 加入收藏
计科1102
Rank: 1
等 级:新手上路
帖 子:56
专家分:9
注 册:2013-4-26
结帖率:87.5%
收藏
已结贴  问题点数:10 回复次数:8 
环形队列的转置,不知在哪里出错了?求大神指点迷津!
#include<stdio.h>
#include"sqqueue.h"
#include"sqstack.h"
void reverse(sqqueue *&q)//环形队列转置函数
{
    elemtype x;
    sqstack *ss;//定义一个栈
    ss=(sqstack *)malloc(sizeof(sqstack));//给栈动态分配空间
    ss->top=-1;//一开始栈为空
   
    for(int i=q->front+1;i<=queuelength(q);i++)
    {    x=q->data[i];//把队中元素一一取出来
        push(ss,x);//进栈
    }
   
    q->front=q->rear=0;    //先还原队,也就是空队
    int j=q->front+1;//把j指在队列中下标为1的位置,
    while(!stackempty(ss))//只要栈不为空,
    {
        pop(ss,x);          //就把栈中的元素出栈一个,放到队中去,出栈一个,放到队中去
        q->data[j] = x;
        j++;        
    }

}
void main()
{
    elemtype e;
    sqqueue *q;
    printf("环形队列基本运算如下:\n");
    printf(" (1)初始化队列q\n");
    initqueue(q);
    printf(" (2)依次进队列元素a,b,c,d,e,f\n");
    if(!enqueue(q,'a')) printf("\t提示:队满,不能进队\n");
    if(!enqueue(q,'b')) printf("\t提示:队满,不能进队\n");
    if(!enqueue(q,'c')) printf("\t提示:队满,不能进队\n");
    if(!enqueue(q,'d')) printf("\t提示:队满,不能进队\n");
    if(!enqueue(q,'e')) printf("\t提示:队满,不能进队\n");
    if(!enqueue(q,'f')) printf("\t提示:队满,不能进队\n");

    printf(" (3)输出原队列q\n");
   
    dispqueue(q);//输出队列

    printf("\n");

    q->front=0;//队首重新指向0
    reverse(q);//队列转置
    printf(" (4)输出转置后的队列q\n");

    dispqueue(q);
    printf("\n");
}
这个是主函数

#include"sqqueue.h"
void initqueue(sqqueue * &q)//初始化队列
{
    q=(sqqueue *)malloc(sizeof(sqqueue));
    q->front=q->rear=0;
}
void destroyqueue(sqqueue * &q)//销毁队列
{
    free(q);
}
bool queueempty(sqqueue *q)//判断队列是否为空
{
    return (q->front==q->rear);
}
int queuelength(sqqueue *q)//求队的长度
{
    int i=0;
    while(q->front!=q->rear)
    {
        i++;
        q->front=(q->front+1)%maxsize;
    }
    return(i);
}
bool enqueue(sqqueue * &q,elemtype e)//进队
{
    if((q->rear+1)%maxsize==q->front)//判断队满与否
        return false;
    q->rear=(q->rear+1)%maxsize;//队尾指针先移动
    q->data[q->rear]=e;//然后元素入到队尾去
    return true;
}
bool dequeue(sqqueue * &q,elemtype &e)//出队
{
    if(q->front==q->rear)
        return false;
    q->front=(q->front+1)%maxsize;//队首指针先移动
    e=q->data[q->front];//然后队首元素出队
    return true;
}
void dispqueue(sqqueue *q)
{
   
    while(!queueempty(q))
        {
            q->front=(q->front+1)%maxsize;
            printf("%c ", q->data[q->front]);
        }
}
这个是队列的基本运算

#include"sqstack.h"
void initstack(sqstack *&s)//初始化栈
{
    s = (sqstack *)malloc(sizeof(sqstack));
    s->top = -1;
}
void destroystack(sqstack *&s)//销毁栈
{
    free(s);
}
bool stackempty(sqstack * s)//判断栈是否为空
{
    return (s->top == -1);
}
bool push(sqstack *&s,elemtype e)//进栈
{
    if(s->top == maxsize1-1)
        return false;
    s->top++;
    s->data1[s->top] = e;
    return true;
}
bool pop(sqstack * &s,elemtype &e)//出栈
{
    if(s->top == -1)
        return false;
    e = s->data1[s->top];
    s->top--;
    return true;
}
bool gettop(sqstack *s,elemtype &e)//得到栈中的某个元素
{
    if(s->top == -1)
        return false;
    e = s->data1[s->top];
    return true;
}
int length(sqstack *s)//求栈的长度
{
    int i=0;
    while(s->top!=-1)
    {
        i++;
        s->top--;
    }
    return(i);
}
void dispstack(sqstack *s)//输出栈
{    elemtype e;
    while(!stackempty(s))
    {
        pop(s,e);
        printf("%c",e);
    }
}
这个是栈的基本运算

#include <stdio.h>
#include <malloc.h>
#define maxsize 100
typedef char elemtype;
typedef struct
{
    elemtype data[maxsize];
    int front,rear;
}sqqueue;
void initqueue(sqqueue * &q);
void destroyqueue(sqqueue * &q);
bool queueempty(sqqueue *q);
bool enqueue(sqqueue * &q,elemtype e);
bool dequeue(sqqueue * &q,elemtype &e);
void dispqueue(sqqueue *q);
int queuelength(sqqueue *q)

#include<stdio.h>
#include<malloc.h>
#define maxsize1 100
typedef char elemtype;
typedef struct
{
    elemtype data1[maxsize1];
    int top;
}sqstack;
void initstack(sqstack *&s);
void destroystack(sqstack *&s);
bool stackempty(sqstack *s);
bool push(sqstack *&s,elemtype e);
bool pop(sqstack *&s,elemtype &e);
bool gettop(sqstack *s,elemtype &e);
int length(sqstack *s);
void dispstack(sqstack *s);

这两个是队列和栈的头文件




[ 本帖最后由 计科1102 于 2013-4-27 22:48 编辑 ]
搜索更多相关主题的帖子: 动态 include 
2013-04-27 22:46
计科1102
Rank: 1
等 级:新手上路
帖 子:56
专家分:9
注 册:2013-4-26
收藏
得分:0 
还有想说一下这里为什么不能粘贴图呢?我想把结果贴上去,结果发现贴不了!
2013-04-27 22:52
不玩虚的
Rank: 9Rank: 9Rank: 9
来 自:四川
等 级:贵宾
威 望:10
帖 子:331
专家分:1301
注 册:2012-12-9
收藏
得分:5 
头文件是这么写的?好像不是吧

同学习......同进步....你帮我......我帮你.....上善若水.....
2013-04-28 10:20
计科1102
Rank: 1
等 级:新手上路
帖 子:56
专家分:9
注 册:2013-4-26
收藏
得分:0 
回复 3楼 不玩虚的
我们老师说这是另外一种写法,其实可以把我所说的那两个所谓的头文件放在相应的基本运算里面的。现在能运行起来,但就是不能得到转置的输出,也就是没有转置的输出。问题应该是出现在转置函数里面的,可就是不知道问题在哪里,求指教!
2013-04-28 13:03
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:5 
建议楼主写一个纯C的代码实现,这样你就明白了

错误在 int queuelength(sqqueue *q) 函数中


[fly]存在即是合理[/fly]
2013-04-28 13:25
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
reverse也有问题,为什么不用enqueue函数?


[fly]存在即是合理[/fly]
2013-04-28 13:29
计科1102
Rank: 1
等 级:新手上路
帖 子:56
专家分:9
注 册:2013-4-26
收藏
得分:0 
求队的长度函数经过测试是没问题的。我的思想是这样的:一个环形队列,取出里面的一个元素放到栈中,再取出一个放到栈中。。。。直到取完环形队列中的元素。然后再把栈中的元素一个一个放进环形队列中,实现环形队列的转置。其中就是利用了栈的后进先出的特点。只利用enqueue进队函数不能实现这个功能吧?!
2013-04-28 16:33
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
呵呵,用你的函数测试一下这个,

dispqueue(q);
queuelength(q);
dispqueue(q);


[fly]存在即是合理[/fly]
2013-04-28 17:02
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
以下是引用计科1102在2013-4-28 16:33:06的发言:

求队的长度函数经过测试是没问题的。我的思想是这样的:一个环形队列,取出里面的一个元素放到栈中,再取出一个放到栈中。。。。直到取完环形队列中的元素。然后再把栈中的元素一个一个放进环形队列中,实现环形队列的转置。其中就是利用了栈的后进先出的特点。只利用enqueue进队函数不能实现这个功能吧?!



我是说 把栈中的元素一个一个放进环形队列 这一步 为什么不用enqueue函数?


[fly]存在即是合理[/fly]
2013-04-28 17:21
快速回复:环形队列的转置,不知在哪里出错了?求大神指点迷津!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013021 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved