| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 315 人关注过本帖
标题:数据结构栈的问题 大家看看为什么出不了结果 最终出现内存不能written.....
只看楼主 加入收藏
liuting8181
Rank: 2
等 级:论坛游民
帖 子:54
专家分:19
注 册:2011-4-21
结帖率:50%
收藏
已结贴  问题点数:5 回复次数:7 
数据结构栈的问题 大家看看为什么出不了结果 最终出现内存不能written.....
用栈做一个进制转换
#include <stdio.h>
#include <stdlib.h>
#include<malloc.h>

#define OK 1
#define ERROR 0
#define FALSE 0
#define  TRUE 1

#define STACK_INIT_SIZE 100
#define ADD_SIZE 10

typedef int Status;
typedef  int SElemType;
typedef struct  
{
    SElemType *base;
    SElemType *top;
    int length;

}SqlStack;

Status InitStack(SqlStack *s)     //初始化栈
{
    s->base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
    if(!s->base)
        exit(0);
    s->top=s->base;
    s->length=STACK_INIT_SIZE;
    return OK;
}

Status GetTop(SqlStack *s)   //取栈顶元素
{
    if(s->top==s->base)
        return ERROR;
    return *(s->top-1);
}

void Push(SqlStack *s,int e)  //入栈
{
    if(s->top-s->base>=STACK_INIT_SIZE)
    {
        s->base=(SElemType*)realloc(s->base,(STACK_INIT_SIZE+ADD_SIZE)*sizeof(SElemType));
        if(!s->base)
        exit(0);
        s->top=s->base+s->length;
        s->length+=ADD_SIZE;
    }

    *s->top++=e;
}

Status Pop(SqlStack *s,SElemType e)//出栈
{
    if(s->top==s->base)
        return ERROR;
    else
        e=*--s->top;
    return e;
}
Status  EmptyStack(SqlStack *s)//判断栈空
{
    if(s->top==s->base)
        return 0;
    else
        return 1;
}

void ClearStack(SqlStack *s)  //清空栈
{
    s->top=s->base;
    s->length=STACK_INIT_SIZE;
   
}
void  DestroyStack(SqlStack *s)  //销毁栈
{
    s->top=NULL;
    s->length=0;
    free(s->base);
    s->base=NULL;

}


void conversion()    // 10进制转8进制
{
    int num;
    int e,e1;
    SqlStack *L;

    InitStack(L);

    printf("\t请输入一个正整数:");
    scanf("%d",&num);

    while(num)
    {
        Push(L,num/8);
        num%=8;
    }
    while(!EmptyStack(L))
    {
        e=Pop(L,e1);
        printf("%d",e);
    }
}

int main(void)   
{
    conversion();

    return 0;
}
2011-09-15 15:19
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:2 
程序代码:
#include <cstdio>
#include <stack>
using namespace std;
int main()
{
    int i,j,k;
    int n;
    while(scanf("%d",&n) && n)
    {
        stack<int> s;
        while(n)
        {
            s.push(n%2);
            n = n>>1;
        }
        while(!s.empty())
        {
            printf("%d",s.top());
            s.pop();
        }
        printf("\n");
    }
    return 0;
}
你的是在有点长了

                                         
===========深入<----------------->浅出============
2011-09-15 15:27
liuting8181
Rank: 2
等 级:论坛游民
帖 子:54
专家分:19
注 册:2011-4-21
收藏
得分:0 
回复 2楼 laoyang103
为什么还是出现那个 内存不能written的问题,编译明明没有错误。。这是什么原因?请指教下。。。
2011-09-15 22:17
nextleave
Rank: 2
等 级:论坛游民
帖 子:52
专家分:92
注 册:2011-9-12
收藏
得分:2 
出这种问题是因为没有给创建的指针赋初值,该指针指向的内容是随机的,然后你将一个元素赋给那个随机的地址.虽然你是把那个随机的地址当做int型用的,便是那个地址极有可能是不可用的.所以系统会告诉你该地址是不可写的.你将元素赋给该地址的操作是非法的.因为该随机地址是不可写的!懂?
2011-09-16 00:22
nextleave
Rank: 2
等 级:论坛游民
帖 子:52
专家分:92
注 册:2011-9-12
收藏
得分:0 
#include "stdafx.h"


int main(int argc, char* argv[])
{int *p;
//int a;
//p=&a;
*p=1;
    return 0;
}
这个程序如果不注释就没错,如果像上面那样注释了就和你犯的错误一样了.
2011-09-16 00:26
czsbc
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:469
专家分:1700
注 册:2008-12-13
收藏
得分:2 
Status InitStack(SqlStack *s)  
{
    s->base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
}
//这里的s只是一个指针,没有指向任何内存空间,也就是说s是没有值的,或者是一个不确定的值,s->base也就是非法访问了。
应该先用s=(SqlStack *)malloc(sizeof(SqlStack));才可以做s->base引用.
2011-09-16 00:34
nextleave
Rank: 2
等 级:论坛游民
帖 子:52
专家分:92
注 册:2011-9-12
收藏
得分:0 
英雄所见略同!
2011-09-16 00:41
liuting8181
Rank: 2
等 级:论坛游民
帖 子:54
专家分:19
注 册:2011-4-21
收藏
得分:0 
回复 6楼 czsbc
是啊,多谢指教。。。你一说还真是那么回事。。嘿嘿
2011-09-16 09:58
快速回复:数据结构栈的问题 大家看看为什么出不了结果 最终出现内存不能written ...
数据加载中...
 
   



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

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