You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现将初始栈元素按奇偶分入对应栈并删除原元素?

栈元素分类实现方案

核心思路

利用你已实现的链表栈操作函数,按以下步骤完成分类:

  • 调用create_stack()分别创建空的偶数栈(even_stack)和奇数栈(odd_stack)
  • 循环处理初始栈,直到初始栈为空:
    • 弹出初始栈的栈顶元素
    • 根据元素奇偶性,将其推入对应的偶数栈或奇数栈
  • 最后可通过print_stack()验证三个栈的状态

修改后的Testing函数示例

假设你已有的栈函数定义如下(基于你提供的实现):

// 栈节点结构
typedef struct Node {
    int data;
    struct Node* next;
} Node;

// 栈结构
typedef struct Stack {
    Node* top;
} Stack;

// 创建空栈
Stack* create_stack() {
    Stack* stack = (Stack*)malloc(sizeof(Stack));
    stack->top = NULL;
    return stack;
}

// 入栈操作
void push(Stack* stack, int data) {
    Node* new_node = (Node*)malloc(sizeof(Node));
    new_node->data = data;
    new_node->next = stack->top;
    stack->top = new_node;
}

// 出栈操作,返回栈顶元素,栈为空时返回-1(可根据需求调整)
int pop(Stack* stack) {
    if (stack->top == NULL) {
        printf("Stack underflow\n");
        return -1;
    }
    Node* temp = stack->top;
    int data = temp->data;
    stack->top = stack->top->next;
    free(temp);
    return data;
}

// 打印栈元素(从栈顶到栈底)
void print_stack(Stack* stack) {
    Node* current = stack->top;
    printf("Stack: ");
    while (current != NULL) {
        printf("%d ", current->data);
        current = current->next;
    }
    printf("\n");
}

以下是修正后的测试函数:

void testing() {
    // 创建初始栈并推入测试元素
    Stack* initial_stack = create_stack();
    push(initial_stack, 1);
    push(initial_stack, 2);
    push(initial_stack, 3);
    push(initial_stack, 4);
    push(initial_stack, 5);
    printf("初始栈状态:");
    print_stack(initial_stack); // 预期输出:Stack: 5 4 3 2 1 

    // 创建偶数栈和奇数栈
    Stack* even_stack = create_stack();
    Stack* odd_stack = create_stack();

    // 循环处理初始栈元素
    while (initial_stack->top != NULL) {
        int val = pop(initial_stack);
        if (val % 2 == 0) {
            push(even_stack, val);
        } else {
            push(odd_stack, val);
        }
    }

    // 打印结果验证
    printf("处理后初始栈状态:");
    print_stack(initial_stack); // 预期输出:Stack: 
    printf("偶数栈状态:");
    print_stack(even_stack);    // 预期输出:Stack: 4 2 
    printf("奇数栈状态:");
    print_stack(odd_stack);     // 预期输出:Stack: 5 3 1 
}

关键说明

  • 循环终止条件判断initial_stack->top != NULL,确保初始栈的所有元素都被处理
  • 每次通过pop()取出初始栈元素,直接推入对应栈,同时完成初始栈元素的删除,符合你“每完成一次推入就删除初始栈元素”的要求
  • 如果需要偶数栈/奇数栈的元素顺序和初始栈中出现的顺序一致(比如初始栈中偶数是2、4,希望偶数栈栈顶是2),可以额外对even_stack/odd_stack做一次反转,或者在处理时用临时容器暂存元素后再反向推入

内容的提问来源于stack exchange,提问作者Klau

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 18:00:53