这是我的代码:
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);
}
如何删除堆栈中间的元素?
答案 0 :(得分:3)
只能从末尾访问堆栈,因此从堆栈中间删除项目的算法需要第二个堆栈来临时存储数据:
答案 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;
}