在C中高效实现堆栈

时间:2016-08-10 06:45:19

标签: c algorithm performance data-structures stack

https://www.hackerrank.com/challenges/equal-stacks
对于这个问题,我试图在c中实现堆栈数据结构。但是我使用以下代码在某些情况下会超时:

#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <limits.h>
#include <stdbool.h>
struct Stack{
    int top;
    int size;
    int sum;
    int* arr;
};
struct Stack* createStack(int size){
    struct Stack* stack = (struct Stack*)malloc(sizeof(struct Stack));
    stack->size=size;
    stack->top=-1;
    stack->sum=0;
    stack->arr = (int*)malloc(sizeof(int)*size);
    return stack;
}
int isempty(struct Stack* stack){
    if(stack->top==-1)
        return 1;
    return 0;
}
void push(struct Stack* stack,int term){
    stack->top++;
    stack->arr[stack->top]=term;
    stack->sum+=term;
}
void pop(struct Stack* stack){
    if(isempty(stack)==0){
        stack->sum-=stack->arr[stack->top];
        stack->top--;
    }
}
int main(){
    int size1,size2,size3;
    scanf("%d %d %d",&size1,&size2,&size3);
    int arr1[size1];
    for(int i=0;i<size1;i++)
        scanf("%d",&arr1[i]);
    struct Stack* stack1 = createStack(size1);
    for(int i=size1-1;i>=0;i--)
        push(stack1,arr1[i]);
    int arr2[size2];
    for(int i=0;i<size2;i++)
        scanf("%d",&arr2[i]);
    struct Stack* stack2 = createStack(size2);
    for(int i=size2-1;i>=0;i--)
        push(stack2,arr2[i]);
    int arr3[size3];
    for(int i=0;i<size3;i++)
        scanf("%d",&arr3[i]);
    struct Stack* stack3 = createStack(size3);
    for(int i=size3-1;i>=0;i--)
        push(stack3,arr3[i]);
    while(stack1->sum!=stack2->sum || stack2->sum!=stack3->sum){
        if(stack1->sum > stack2->sum && stack1->sum > stack3->sum)
            pop(stack1);
        if(stack2->sum > stack1->sum && stack2->sum > stack3->sum)
            pop(stack2);
        if(stack3->sum > stack2->sum && stack3->sum > stack1->sum)
            pop(stack3);
    }
    printf("%d\n",stack1->sum);
}

有人建议只使用堆栈数据结构(最好是C)的更好的方法吗?

2 个答案:

答案 0 :(得分:2)

您可以通过确定哪个堆栈具有最高总和,然后从该堆栈弹出直到其总和等于或小于最低总和来加快速度。

查找具有最高和最低总和的堆栈的代码可能如下所示

struct Stack *high = (stack1->sum > stack2->sum) ? stack1 : stack2;
struct Stack *low  = (high == stack1) ? stack2 : stack1;

if ( stack3->sum > high->sum )
    high = stack3;
else if ( stack3->sum < low->sum )
    low = stack3;

然后减少最高总和的代码就像这样

while ( high->sum > low->sum )
    pop( high );

答案 1 :(得分:1)

您可能超出时间限制的原因是因为您的while循环永远不会结束

a)任何堆栈都变空。你应该在while循环条件中添加该检查,没有任何堆栈是空的,然后输出所有三个堆栈的最小总和。

b)可能存在高度为20,10,10的情况,在这种情况下,您的代码将如何工作?