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)
}