【问题标题】: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】:
堆栈只能从末端访问,因此从堆栈中间删除项目的算法需要第二个堆栈来临时存储数据:
- 从 Stack One 中弹出一个项目
- 如果您想保留该物品,请将其推到第二叠
- 重复步骤 1 和 2,直到 Stack One 为空
- 从第二个堆栈中弹出一个项目并将其推到第一个堆栈上
- 重复第 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;
}