回 帖 发 新 帖 刷新版面

主题:多栈模拟中栈的个数问题

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<time.h>
#define N 10



int main()
{
    clock_t start=clock(),end;
    int n,i,num,r,k,j;
    char str[5];
    int **t,**p;
    int *top,*ntop;
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    scanf("%d",&n);
    
    r=N;
    **t=malloc(r*sizeof(int));
    for(i=0;i<r;i++)
        t[i]=malloc(n*sizeof(int));
        
    *top=malloc(r*sizeof(int));
    for(i=0;i<r;i++)
        top[i]=-1;
    
    while(n--)
    {
        scanf("%s %d%d",str,&i,&num);
        if(strcmp(str,"PUSH")==0) 
        {
            if(i>=r)
            {
                **p=malloc((2*i)*sizeof(int));
                for(k=0;k<2*i;k++)
                    p[k]=malloc(n*sizeof(int));
                for(k=0;k<r;k++)
                    *p[k]=*t[k];
                free(t);**t=**p;
                *ntop=malloc((2*i)*sizeof(int));
                for(k=0;k<r;k++)
                    ntop[k]=top[k];                
                for(k=r;k<2*i;k++)
                    ntop[k]=-1;
                free(top);*top=*ntop;
                r=2*i;
            }

            t[i][top[i]+1]=num;
            top[i]++;
        }
        if(strcmp(str,"POP")==0)
        {
            if(i>=r)
            {
                printf("0\n");
                continue;
            }    
            
            num=t[i][top[i]];
            if(top[i]==-1) 
            {
                printf("0\n");
                continue;
            }
            else
            {
                printf("%d\n",num);
                top[i]--;
            }
        }
    }
     end=clock();
    printf("&Ocirc;&Euml;&ETH;&ETH;&Ecirc;±&frac14;&auml;&pound;&ordm;%dms\n",end-start);
    return 0;
}


我就是用一个2维数组模拟多栈,但我想动态的开辟2维数组,
假设原来有r组栈,当数组不够用时比如输入的栈是i>=r,那就在开一个**p,i*n维,我写的程序在上面,就是运行不了。。还请高手指点一下,,

回复列表 (共6个回复)

沙发

What is the purpose of the program?
What problem do you try to solve?

More information, please!

Thanks!

板凳

虽然不知道你想要解决的问题,但是根据你的描述和你的代码,我初步确认了如下事实:
/**********************************************************
scanf("%d",&n);                       //输入每个栈的深度。
***********************************************************/  
/**********************************************************

    r=N;                              //首先初始化N个栈。
    **t=malloc(r*sizeof(int));
    for(i=0;i<r;i++)
        t[i]=malloc(n*sizeof(int));
        
    *top=malloc(r*sizeof(int));
    for(i=0;i<r;i++)
        top[i]=-1;
***********************************************************/      
/**********************************************************
    while(n--)
    {
        scanf("%s %d%d",str,&i,&num);
        if(strcmp(str,"PUSH")==0) 
        {
            if(i>=r)//在初始化N个栈不够用的时候,要动态追加栈。
            {
                **p=malloc((2*i)*sizeof(int));
                for(k=0;k<2*i;k++)
                    p[k]=malloc(n*sizeof(int));
                for(k=0;k<r;k++)
                    *p[k]=*t[k];
                free(t);**t=**p;
                *ntop=malloc((2*i)*sizeof(int));
                for(k=0;k<r;k++)
                    ntop[k]=top[k];                
                for(k=r;k<2*i;k++)
                    ntop[k]=-1;
                free(top);*top=*ntop;
                r=2*i;
            }
***********************************************************/ 

如果以上是事实,并且你要解决的主要问题是这个,那么我有如下建议给你,希望能有所启发:
int** Create2DArray(int rows, int cols)
{
   int** temp=(int**)malloc(rows*sizeof(int*));
   for(int i=0;i<rows;i++) temp[i]=(int*)malloc(cols*sizeof(int));
   return temp;
}

你可以不必再初始化N个栈,而是在输入i后采取Create2DArray来构造二维组;当然,要是你有更好实现,也希望能够指教我一下!

3 楼

这是其中的一个问题,我还想做的就是
二维数组不够用的时候,我想在开辟一个原来大小两倍的数组,并将原来的数组复制,最后返回到原来的数组

4 楼

二维数组有两个维度,你所谓的原来大小二倍似乎是指行那个维度??如果是这样你对Create2DArray稍加改造就可以得到能用的函数啊!例如
int** Create2DArray(int rows, int cols)
{
   int** temp=(int**)malloc(rows*sizeof(int*));
   for(int i=0;i<rows;i++) temp[i]=(int*)malloc(cols*sizeof(int));
   return temp;
}
int** Create2DArrayAddition(int **orgin, int rows, int cols)
{
    int **temp=(int**)malloc(2*rows*sizeof(int*));
    for(int i=0;i<rows*2;i++) temp[i]=(int*)malloc(cols*sizeof(int));
    for(int i=0;i<rows ;i++ ) memcpy(temp[i], orgin[i], cols*sizeof(int));
    return temp;
}
这样Create2DArrayAddition就可以达到增大两倍的目的,且将内容进行了拷贝。但值得注意的是,如果你要反复进行这样的操作,还需要一个Delete2DArray函数来释放没有用的二维数组。如下:
void Delete2DArray(int ***orgin, int rows)
{
    for (int i=0;i<rows ;i++ ) free((*orgin)[i]);
    free((*orgin));
    *orgin=0;
}
这样最终的函数就写成如下:
int** Create2DArrayAddition(int ***orgin, int rows, int cols)
{
    int **temp=(int**)malloc(2*rows*sizeof(int*));
    for(int i=0;i<rows*2;i++) temp[i]=(int*)malloc(cols*sizeof(int));
    for(int i=0;i<rows ;i++ ) memcpy(temp[i], (*orgin)[i], cols*sizeof(int));
    Delete2DArray(orgin, rows);
    return temp;
}

5 楼

谢谢,提醒下我也找到我的程序的问题,其实很简单,就是在最后返回的时候写错了,应该是首地址付值t=p,而我却错写成**t=**p

6 楼

呵呵!祝贺你,我先前只是关心了算法的问题,还真没来得及看你的其他部门。

我来回复

您尚未登录,请登录后再回复。点此登录或注册