行星碰撞问题:

#include "stdio.h"
#include "malloc.h"
#include "math.h"
typedef struct zhan
{
int *top;
int *base;
int size;
}zhan_named;
int chushihua(zhan_named *s,int n);
int pop(zhan_named *s);
int get_top(zhan_named*s,int *x);
void planet(zhan_named *s);
int push(zhan_named *s,int x);
int main()
{
zhan_named s;
int n,num;
printf("请输入数据的个数:");
scanf("%d" , &n);
chushihua(&s,n);
for(int i=0;i<n;i++)
{
scanf("%d",&num);
push(&s,num);
}
planet(&s);
return 0;
}
int chushihua(zhan_named *s,int n)
{
s->base=(int*)malloc(n*sizeof(int));
if(s->base==NULL)
{
printf("overflow!");
exit(0);
}
s->top=s->base;
s->size=n;
return 1;
}
int push(zhan_named *s,int x)
{
if((s->top-s->base)/sizeof(int)==s->size)
{
printf("栈满");
return 0;
}
*s->top++=x;
return 1;
}
int pop(zhan_named *s)
{
if(s->top<=s->base)
{
printf("栈空");
return 0;
}
--s->top;
return 1;
}
int get_top(zhan_named*s,int *x)
{
if(s->top<=s->base)
return 0;
*x=*s->top;
return 1;
}
void planet(zhan_named *s)
{
int front, next;
s->top--;
if (!get_top(s, &next))
{
printf("栈空");
return;
}
pop(s);
while (get_top(s, &front))
{
if (next > 0)
{
next = front;
pop(s);
continue;
}
else if (next * front < 0)
{
if (-front > next)
{
*(s->top + 1) = 0; // 标记为碰撞之后的新元素
next = front;
continue;
}
else if (-front < next)
{
*(s->top) = 0;
continue;
}
else {
*(s->top + 1) = 0;
*(s->top) = 0;
next = *(--s->top);
continue;
}
}
if ((next>0&&front>0)||(next<0&&front<0))
{
*(s->top+1)=0;
next=front;
continue;
}
pop(s);
}
return ;
}
图的基础概念:
1.顶点(Vertex):是图中的基本单位,(理解为有穷非空的集合)。
2.边(Edge):是节点之间的联系,通常由两个节点之间的连线来表示。
3.有向图:边有方向的图称为有向图,也叫做 Digraph。
4.无向图:边没有方向的图称为无向图。
5.权:边可以带有权值,表示任意两个节点之间的距离或者代价。
6.图的路径:从一个结点出发经过若干条边到达另一个结点的过程称为路径。
7.环:在一条路径中,如果一个结点被访问了两次及以上,则该路径就称为环。
8.连通图:在无向图中,如果存在一条路径可以从一个节点到达另一个
9.意节点,则该图称为连通图。
10.强连通图:在有向图中,如果任意两个节点之间都存在一条路径,则该图称为强连通图。
11.子图:一个图的一部分称为它的子图。
12.度:一个节点有多少条边与它相连,就称为该节点的度数。在有向图中,节点的度分为入度和出度。
由图可以构造树:

即为一个有向树。
刚对图进行简单接触,了解不多,未完待续。
文章介绍了使用C语言实现的栈数据结构处理行星碰撞问题,包括栈的初始化、压入、弹出等操作。同时,文章阐述了图的基本概念,如顶点、边、有向图、无向图、权值、路径、环、连通图、强连通图和度数,为后续的图论学习打下基础。
1013

被折叠的 条评论
为什么被折叠?



