C语言中的栈、堆是什么?

Python020

C语言中的栈、堆是什么?,第1张

C语言中的堆和栈都是一种数据项按序排列的数据结构

栈就像装数据的桶或箱子

我们先从大家比较熟悉的栈说起吧,它是一种具有后进先出性质的数据结构,也就是说后存放的先取,先存放的后取。

这就如同我们要取出放在箱子里面底下的东西(放入的比较早的物体),我们首先要移开压在它上面的物体(放入的比较晚的物体)。

堆像一棵倒过来的树

而堆就不同了,堆是一种经过排序的树形数据结构,每个结点都有一个值。

通常我们所说的堆的数据结构,是指二叉堆。堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。

由于堆的这个特性,常用来实现优先队列,堆的存取是随意,这就如同我们在图书馆的书架上取书。

虽然书的摆放是有顺序的,但是我们想取任意一本时不必像栈一样,先取出前面所有的书,书架这种机制不同于箱子,我们可以直接取出我们想要的书。

扩展资料:

关于堆和栈区别的比喻

使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。

使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。

参考资料来源:百度百科-堆栈

#include<stdio.h>

#include<stdlib.h>

#include<time.h>

void sort(int *p)

{int i,j,t,t1

for(i=0i<12i++)

{

for(j=0j<12-ij++)

if(*(p+j)>*(p+j+1))

{t=*(p+j)

 *(p+j)=*(p+j+1)

 *(p+j+1)=t

}

}

for(i=0i<12i++)

if(*(p+i)%13==0)

{

t=*(p+i)

t1=*(p+i)/13

for(j=ij<=12&&*(p+j)/13==t1j++)

*(p+j-1)=*(p+j)

*(p+j-1)=t

i=j-1

}

}

int main()

{int a[52],i,j,t

srand(time(0))

for(i=0i<52i++)a[i]=i

for(i=51i>1i--) //洗牌、发牌(0~12为第一人,13~25为第二人。。。)

{j=rand()%(i+1)

t=a[i]a[i]=a[j]a[j]=t

}

for(i=0i<4i++)        //排序

sort(&a[i*13])

for(i=0i<52i++)

{

  switch(a[i]%13)    //不同点数按不同输出

{

case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:

case 9: printf("%c%-2d  ",3+a[i]/13,a[i]%13+1)break

case 10:  printf("%c%J   ",3+a[i]/13)break

case 11:  printf("%c%Q   ",3+a[i]/13)break

case 12:  printf("%c%K   ",3+a[i]/13)break

case 0:   printf("%c%A   ",3+a[i]/13)

}

if(i%13==12)printf("\n")

}

return 0

}

发牌原程序见我的空间(http://hi.baidu.com/crazycola/blog/item/52402bd4b3f68705a08bb746.html),可选是否包含大小王,可选发牌列数。

以下为改过的版本,不包含大小王(即总数52张),只能发4堆。

另外附加了用户菜单,原程序中不含菜单部分。

代码如下:

---------------------------------------

#include <stdlib.h>

#include <time.h>

#include <stdio.h>

int menu()

{

int choice

printf("1 发牌/0 退出:")

scanf("%d",&choice)

return choice

}

void main( void )

{

int i1, j, total

int *iArr

int tag = 0

char* pok_C[] = { "黑桃", "红桃", "梅花", "方块" }

char* pok_N[] = { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" }

if(!menu()) exit(0)

total = 52

srand( (unsigned)time( NULL ) )

iArr = (int*)malloc(total*sizeof(int))

for( i1=0i1<totali1++ )

{

iArr[i1]=rand()%total

if( i1==0 ) continue

do {

tag = 0

for( j=0j<i1j++ )

if( iArr[j] == iArr[i1] )

{

iArr[i1]=rand()%total

tag = 1

}

} while( tag==1 )

}

for( i1=0i1<totali1++ )

{

printf("%s%s\t",pok_C[iArr[i1]%4],pok_N[iArr[i1]%13])

if(i1%4==3) printf("\n")

}

free(iArr)

}