user: 请从给定的汇编指令推导出C源代码：

```asm
<test_Queue>:
  endbr64
  push   %r15
  lea    D57(%rip),%r15
  push   %r14
  lea    D48(%rip),%r14
  push   %r13
  push   %r12
  lea    D4(%rip),%r12
  push   %rbp
  push   %rbx
  lea    D54(%rip),%rbx
  sub    $0x18,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x8(%rsp)
  xor    %eax,%eax
  movl   $0x0,0x4(%rsp)
  mov    %rsp,%r13
  nopl   0x0(%rax)
L100:
  mov    %r14,%rdi
  call   <puts@plt>
  mov    %r13,%rsi
  mov    %r12,%rdi
  call   <scanf@plt>
  cmpl   $0x4,(%rsp)
  ja     L120
  mov    (%rsp),%eax
  movslq (%rbx,%rax,4),%rax
  add    %rbx,%rax
  notrack jmp *%rax
  nopw   0x0(%rax,%rax,1)
  test   %rbp,%rbp
  je     L48
  mov    %rbp,%rdi
  call   <DeQueue@plt>
  mov    %eax,0x4(%rsp)
  mov    %eax,%esi
L112:
  lea    D20(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  nopl   (%rax)
L106:
  mov    (%rsp),%eax
  test   %eax,%eax
  jne    L100
L36:
  mov    0x8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L82
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopw   0x0(%rax,%rax,1)
  lea    D49(%rip),%rdi
  call   <puts@plt>
  lea    0x4(%rsp),%rsi
  mov    %r12,%rdi
  call   <scanf@plt>
  test   %rbp,%rbp
  je     L16
L71:
  mov    0x4(%rsp),%esi
  mov    %rbp,%rdi
  call   <EnQueue@plt>
  jmp    L106
  nopl   0x0(%rax)
  xor    %eax,%eax
  call   <CreateQueue@plt>
  mov    %rax,%rbp
  jmp    L106
  nopl   0x0(%rax)
  test   %rbp,%rbp
  je     L36
L30:
  mov    %rbp,%rdi
  xor    %ebp,%ebp
  call   <DeleteQueue@plt>
  jmp    L106
  nopl   0x0(%rax)
  test   %rbp,%rbp
  jne    L30
  jmp    L100
L120:
  mov    %r15,%rdi
  call   <puts@plt>
  jmp    L106
  nopw   0x0(%rax,%rax,1)
L48:
  mov    0x4(%rsp),%esi
  jmp    L112
  nopl   0x0(%rax)
L16:
  xor    %eax,%eax
  call   <CreateQueue@plt>
  mov    %rax,%rbp
  jmp    L71
L82:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: retrieve_data
arguments: data_tag: D57
data_type: string
name: retrieve_data
arguments: data_tag: D48
data_type: string
name: retrieve_data
arguments: data_tag: D4
data_type: string
name: retrieve_data
arguments: data_tag: D20
data_type: string
name: retrieve_data
arguments: data_tag: D49
data_type: string

tool: D57: Wrong Operation Selected

tool: D48: Enter Operation: (1) Create; (2): Enqueue; (3): DeQueue; (4) DeleteQ; (0): Exit

tool: D4: %d

tool: D20: Dequeued Element: %d


tool: D49: Enter Queue Element

assistant: ```c
void test_Queue() {
  struct Queue *Q;
  int ans, data = 0;
  do {
    printf("Enter Operation: (1) Create; (2): Enqueue; (3): DeQueue; (4) DeleteQ; (0): Exit\n");
    scanf("%d", &ans);
    switch (ans) {
    case 1:
      Q = CreateQueue();
      break;
    case 2:
      printf("Enter Queue Element\n");
      scanf("%d", &data);
      if (!Q)
        Q = CreateQueue();
      EnQueue(Q, data);
      break;
    case 3:
      if (Q)
        data = DeQueue(Q);
      printf("Dequeued Element: %d\n", data);
      break;
    case 4:
      if (Q) {
        DeleteQueue(Q);
        Q = NULL;
      }
      break;
    case 0:
      if (Q) {
        DeleteQueue(Q);
        Q = NULL;
      }
      break;
    default:
      printf("Wrong Operation Selected\n");
    }
  } while (ans != 0);
}
```