leetcode735小行星碰撞|题解C语言

28 阅读2分钟

735. 小行星碰撞 - 力扣(LeetCode)

这道题自己在纸上模拟一下,入栈、出栈、碰撞、输出的操作,会比较好想,注意输出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;
}