【问题标题】:How to remove an element which is not on the top of the stack?如何删除不在堆栈顶部的元素?
【发布时间】:2017-10-31 12:33:42
【问题描述】:

这是我的代码:

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);
}

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

【问题讨论】:

    标签: c data-structures stack


    【解决方案1】:

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

    1. 从 Stack One 中弹出一个项目
    2. 如果您想保留该物品,请将其推到第二叠
    3. 重复步骤 1 和 2,直到 Stack One 为空
    4. 从第二个堆栈中弹出一个项目并将其推到第一个堆栈上
    5. 重复第 4 步,直到堆栈二为空

    【讨论】:

      【解决方案2】:

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

      我们将您的原始堆栈称为 S1。基本上,您将分配第二个堆栈 S2。然后,以下是您将如何处理删除的粗略伪代码。

      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)
      

      这种方法保持了S1中元素原有的相对顺序。

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

      【讨论】:

        【解决方案3】:

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

        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;
        }
        

        【讨论】:

          猜你喜欢
          • 2010-10-19
          • 2022-11-02
          • 1970-01-01
          • 1970-01-01
          • 2021-05-27
          • 2013-11-07
          • 1970-01-01
          • 2020-12-11
          • 2017-09-06
          相关资源
          最近更新 更多