删除不在堆栈顶部的元素

时间:2017-10-31 12:33:43

标签: c data-structures stack pop

这是我的代码:

void removeOddValues(Stack *s)
{
    Stack *odd = (Stack*)malloc(sizeof(Stack));
    odd->ll.head = NULL;
    odd->ll.size = 0;

    while(s->ll.head->item % 2 == 0){
        push(odd, s->ll.head->item);
    }
    pop(s);

    while(!isEmptyStack(odd)){
        push(s, odd->ll.head->item);
        pop(odd);
    }
    free(odd);
}

如何删除堆栈中间的元素?

3 个答案:

答案 0 :(得分:3)

只能从末尾访问堆栈,因此从堆栈中间删除项目的算法需要第二个堆栈来临时存储数据:

  1. 从Stack One中弹出一个项目
  2. 如果您想保留该项目,请将其推送到Stack Two
  3. 重复步骤1和2,直到Stack One为空
  4. 从Stack Two弹出一个项目并将其推送到Stack One
  5. 重复步骤4直到Stack Two为空

答案 1 :(得分:2)

按其定义(即LIFO)的堆栈不支持直观地删除中间的元素。如果您需要删除不在顶部的元素,建议不要使用堆栈。但是,如果您必须>,那么您可以只使用第二个堆栈来存储您不想删除的元素,因为您要搜索要删除的元素。

让我们调用原始堆栈S 1 。基本上你会分配第二个堆栈S 2 。然后,以下是关于如何处理删除的粗略伪代码。

while you still have elements to remove:
    item = pop from S_1
    if NOT item is to be removed:
        S_2.push(item)

//once removal is done
while S_2 is NOT empty:
    S_1.push(S_2.pop)

此方法维持S 1 中元素的原始相对顺序。

但是,请注意,此方法不是最佳的,因为此操作在空间和时间方面不是最佳的,尽管是一个常数因子。您最好使用除堆栈之外的其他一些数据结构,以便能够以最佳方式实现它。

答案 2 :(得分:1)

所有提供的答案都很好。但是你正在建立一个新的堆栈。您可以在同一堆栈上执行删除操作。 这是代码:

struct Node* deleteValue(struct Node *node, int value){
    struct Node* temp = NULL;
    struct Node* curr = node;
    if(node == NULL)
      return node;
    else if(node->data == value){
        temp =  node;
        node = node->next;
        free(temp);
        return node;
    }
    while(curr->next != NULL){
       if(curr->next->data == value){
           temp =  curr->next;
           curr->next = curr->next->next;
           free(temp);
           break;
       }
       curr = curr->next;
   }
   return node;
}