如何实现从创建的堆栈中删除偶数元素



如何实现从创建的堆栈中删除偶数元素?这是代码。我还不太熟悉这个话题。我请求帮助。我需要在函数DelEven((中实现从创建的堆栈中删除偶数元素。我不知道怎么做。有人能帮我吗?现在,在调用DelEven函数后,0和1仍然是,而不是列表

#include <iostream>
#include <stdlib.h>
using namespace std;
struct Stack {             
int info;
Stack * next;
} *beg, *t;
Stack* InStack(Stack*, int);
void View(Stack*);
void Del_All(Stack **);
void Sort_p(Stack **);
void Sort_info(Stack *);
Stack* DelEven(Stack *);
int main(int argc, char* argv[]){
int i, in, n, kod;
while(true){
cout << "ntCreat - 1.tAdd - 2.tView - 3.tDel - 4.tSort1 - 5.tSort2 - 6.tInd_zad - 7.tEXIT - 0.  :  " ;
cin >> kod;
switch(kod) {
case 1: case 2:         
if(kod == 1 && beg != NULL){
cout << "Clear Memory!" << endl;
break;
}
cout << "Input kol = ";         cin >> n;
for(i = 1; i <= n; i++)  {
in = rand();
beg = InStack(beg, in);         }
if (kod == 1) cout << "Create " << n << endl;
else cout << "Add " << n << endl;
break;
case 3:         if(!beg){
cout << "Stack Pyst!" << endl;
break;                   }
cout << "--- Stack ---" << endl;
View(beg);
break;
case 4:    
Del_All(&beg);
cout<<"Memory Free!"<<endl;
break;
case 5:
if(beg != NULL) Sort_p(&beg);
break;
case 6:
if(beg != NULL) Sort_info(beg);
break;
case 7:
if(beg != NULL) DelEven(beg);
break;
case 0:
if(beg != NULL)
Del_All(&beg);     }     }}
Stack* InStack(Stack *p, int in) {
Stack *t = new Stack;
t -> info = in;
t -> next = p;
return t;}
void View(Stack *p)
{
int c;
Stack *t = p;
while( t != NULL) {
c = t->info;
cout<<"   "<<c<<endl;
t = t -> next;        }}
void Del_All(Stack **p) {
while(*p != NULL) {
t = *p;
*p = (*p) -> next;
delete t;        }}
void Sort_p(Stack **p) {
Stack *t = NULL, *t1, *r;
if ((*p) -> next -> next == NULL) return;
do {
for (t1=*p; t1-> next->next  != t; t1=t1-> next)
if (t1->next->info  >  t1-> next-> next-> info){
r = t1->next->next;
t1 -> next -> next = r -> next;
r-> next =t1-> next;
t1-> next = r;                  }
t= t1-> next;
} while ((*p)-> next -> next != t);}
void Sort_info(Stack *p) {
Stack *t = NULL, *t1;
int r;
do {
for (t1=p; t1 -> next != t; t1 = t1-> next)
if (t1-> info > t1-> next -> info)  {
r = t1-> info;
t1-> info = t1-> next -> info;
t1-> next -> info = r;   }
t = t1;     } while (p -> next != t);}
Stack* DelEven(Stack *p) {       
Stack* t = p;
Stack* t1 = p;
while (t != NULL) {
if (t->info % 2 != 0) {
t1 = t;
t = t->next;        }
else {
if (t == p) {
p = p->next;
delete t;
return p;           }
else {
t1->next = t->next;
delete t;
t = t1->next;           }}  }}

您可以从原始堆栈中逐个弹出所有元素,并将要保留的元素添加到新的(临时(堆栈中。

这个新堆栈将被反转,因此您需要再次从新堆栈中逐个弹出所有元素,并将它们推送到原始堆栈。


虽然上述解决方案是";适当的";以及用泛型堆栈处理此类问题的泛型方法,因为您可以控制实现,所以可以将其视为一个简单的(单个(链表。

因此,您可以通过简单地遍历列表,根据需要删除元素来创建快捷方式。

您需要处理列表头(堆栈顶部(是需要删除的节点的特殊情况。除此之外,您还需要跟踪上一个节点,因为您需要更改其next指针。

此函数声明

void  Del_even(Stack *p){
}

不正确。指向堆栈顶部节点的指针按值传递给函数。但是,如果它指向具有偶数值的节点,则可以在函数内对其进行更改。由于函数按值接受指针,这意味着它处理原始指针值的副本,并且在函数中更改副本不会反映原始指针的值。

由于你的程序是用C风格编写的,那么在C中通过引用传递指针意味着通过指向它的指针间接传递指针

也就是说,该函数应该具有与函数Del_All:相同的声明

void Del_All(Stack **);

这就像

void  Del_even(Stack **);

该函数可以实现为例如递归函数。

void  Del_even(Stack **p)
{
if ( *p )
{
Del_even( &( *p )->next );
if ( ( *p )->info % 2 == 0 )
{
Stack *current = *p;
*p = ( *p )->next;
delete current;
}
}
}     

这个函数被称为

Del_even( &beg );

非递归函数可以通过以下方式定义

void  Del_even(Stack **p)
{
while ( *p )
{
if ( ( *p )->info % 2 == 0 )
{
Stack *current = *p;
*p = ( *p )->next;
delete current;
}
else
{
p = &( *p )->next;
}
}
}     

并以与递归函数相同的方式调用

Del_even( &beg );

最新更新