这道题自己在纸上模拟一下,入栈、出栈、碰撞、输出的操作,会比较好想,注意输出result数组要逆序输出,而数组的大小又不能是变量,所以分配动态内存
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <stddef.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define STACK_INIT_SIZE 100
typedef int Status;
typedef struct {
int *base;
int *top;
int stacksize;
}Stack;
Status InitStack(Stack &S)
{
S.base = (int *)malloc(STACK_INIT_SIZE * sizeof(int));
if(!S.base) exit(OVERFLOW);
S.stacksize = STACK_INIT_SIZE;
S.top = S.base;
return OK;
}//InitStack
Status GetTop(Stack S,int &e)
{ if (S.top==S.base) return ERROR;
e = *(S.top-1);
return OK;
}
Status Push(Stack &S, int x)
{
if(S.top - S.base >= S.stacksize ) return OVERFLOW;
*S.top++ = x;
return OK;
}//push
Status Pop(Stack &S, int &x)
{
if(S.top == S.base ) return ERROR;
x = *(--S.top);
return OK;
}//pop
Status StackEmpty(Stack S)
{
if(S.top == S.base ) return TRUE;
else return FALSE;
}
//形参分别为存行星的整型数组,数组大小
int asteroidCollision(int* asteroids, int asteroidsSize){
Stack leftStack,rightStack;
int i, currentAsteroid;
InitStack(leftStack);//存左行星(负值),他左侧没有右行星
InitStack(rightStack);//存右行星(正值),等待左行星到来
for(i = 0; i < asteroidsSize; i++) {
currentAsteroid = asteroids[i];
if(currentAsteroid > 0) {
// 向右移动的行星,直接入右栈
Push(rightStack, currentAsteroid);
} else {
// 向左移动的行星变为正数
currentAsteroid = -currentAsteroid;
while(!StackEmpty(rightStack)) {
int rightTop;
GetTop(rightStack, rightTop);
// 如果右栈顶端行星比当前行星小,右栈顶端行星爆炸
if(rightTop < currentAsteroid) {
Pop(rightStack, rightTop);
} else if(rightTop == currentAsteroid) { // 如果右栈顶端行星与当前行星大小相同,两者都爆炸
Pop(rightStack, rightTop);
currentAsteroid = 0; // 当前行星也爆炸
break;
} else { // 如果右栈顶端行星比当前行星大,则当前行星爆炸
currentAsteroid = 0;
break;
}
}
if(currentAsteroid != 0) {
// 若栈空,则将向左移动的行星入左栈
Push(leftStack, -currentAsteroid);
}
}
}
int* result = (int*)malloc(sizeof(int) * (leftStack.top - leftStack.base + rightStack.top - rightStack.base));
int* p = result;
while(!StackEmpty(rightStack)) {
Pop(rightStack, *p++);
}
while(!StackEmpty(leftStack)) {
Pop(leftStack, *p++);
}
for(int j = p - result - 1; j >= 0; j--) {
printf("%d", result[j]);
if(j != 0) printf(" ");
}
free(result);
return 0;
}
int main(int argc, char** argv)
{
int nums[100];
for(int i=1; i<argc; i++)
nums[i-1] = atoi(argv[i]);
asteroidCollision(nums,argc-1);
return OK;
}