user: Translate the below assembly code into C programming language:

```asm
<test_Queue>:
  endbr64
  push   %r15
  lea    D59(%rip),%r15
  push   %r14
  lea    D35(%rip),%r14
  push   %r13
  push   %r12
  lea    D54(%rip),%r12
  push   %rbp
  push   %rbx
  lea    D41(%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)
L18:
  mov    %r14,%rdi
  call   <puts@plt>
  mov    %r13,%rsi
  mov    %r12,%rdi
  call   <scanf@plt>
  cmpl   $0x4,(%rsp)
  ja     L14
  mov    (%rsp),%eax
  movslq (%rbx,%rax,4),%rax
  add    %rbx,%rax
  notrack jmp *%rax
  nopw   0x0(%rax,%rax,1)
  test   %rbp,%rbp
  je     L35
  mov    %rbp,%rdi
  call   <DeQueue@plt>
  mov    %eax,0x4(%rsp)
  mov    %eax,%esi
L126:
  lea    D8(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  nopl   (%rax)
L98:
  mov    (%rsp),%eax
  test   %eax,%eax
  jne    L18
L17:
  mov    0x8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L136
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopw   0x0(%rax,%rax,1)
  lea    D20(%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    L98
  nopl   0x0(%rax)
  xor    %eax,%eax
  call   <CreateQueue@plt>
  mov    %rax,%rbp
  jmp    L98
  nopl   0x0(%rax)
  test   %rbp,%rbp
  je     L17
L93:
  mov    %rbp,%rdi
  xor    %ebp,%ebp
  call   <DeleteQueue@plt>
  jmp    L98
  nopl   0x0(%rax)
  test   %rbp,%rbp
  jne    L93
  jmp    L18
L14:
  mov    %r15,%rdi
  call   <puts@plt>
  jmp    L98
  nopw   0x0(%rax,%rax,1)
L35:
  mov    0x4(%rsp),%esi
  jmp    L126
  nopl   0x0(%rax)
L16:
  xor    %eax,%eax
  call   <CreateQueue@plt>
  mov    %rax,%rbp
  jmp    L71
L136:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: disassemble_data
arguments: data_label: D59
data_type: string
name: disassemble_data
arguments: data_label: D35
data_type: string
name: disassemble_data
arguments: data_label: D54
data_type: string
name: disassemble_data
arguments: data_label: D8
data_type: string
name: disassemble_data
arguments: data_label: D20
data_type: string

tool: D59: Wrong Operation Selected

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

tool: D54: %d

tool: D8: Dequeued Element: %d


tool: D20: 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);
}
```