avatar

目录
Icoding平台第二次作业解析-队列栈

T1

  1. 队列 循环列表表示栈
    假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针),请完成下列任务:
    1: 队列初始化,成功返回真,否则返回假

    bool init_queue(LinkQueue LQ);
    2: 入队列,成功返回真,否则返回假:
    bool enter_queue(LinkQueue *LQ, ElemType x);
    3: 出队列,成功返回真,且
    x为出队的值,否则返回假
    bool leave_queue(LinkQueue *LQ, ElemType *x);

相关定义如下:

typedef struct _QueueNode {
ElemType data; /数据域/
struct _QueueNode next; /*指针域/
}LinkQueueNode, *LinkQueue;

  1. 解析
    Code
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    /*
    * 完成人 :岳昕峰(201909******4)
    * 完成时间:2020-03-26, Thu, 10:34:14
    * 最高分数:100
    */


    #include "list.h" // 请不要删除,否则检查不通过
    #include <stdio.h>
    #include <stdlib.h>

    bool init_queue(LinkQueue* LQ)
    {
    *LQ = (LinkQueue)malloc(sizeof(LinkQueueNode));
    if (*LQ == NULL) {
    return 0;
    }
    (*LQ)->next = *LQ;
    return 1;
    }

    bool enter_queue(LinkQueue* LQ, ElemType x)
    {
    if (*LQ == NULL) {
    return 0;
    }
    LinkQueueNode* p = (LinkQueueNode*)malloc(sizeof(LinkQueueNode));
    if (!p) {
    return 0;
    } else {
    p->data = x;
    p->next = (*LQ)->next;
    (*LQ)->next = p;
    *LQ = p;
    return 1;
    }
    }

    bool leave_queue(LinkQueue* LQ, ElemType* x)
    {
    LinkQueue rear = (*LQ);
    if (rear->next == rear)
    return 0;
    (*x) = rear->next->next->data;
    if (rear->next->next == rear) {
    (*LQ) = (*LQ)->next;
    free(rear);
    (*LQ)->next = (*LQ);
    return 1;
    }
    LinkQueue temp = rear->next->next;
    rear->next->next = temp->next;
    free(temp);
    return 1;
    }

T2

  1. 栈 后缀表达式计算
    请使用已定义好的栈完成后缀表达式计算:
    (1)如果是操作数,直接入栈
    (2)如果是操作符op,连续出栈两次,得到操作数x 和 y,计算 x op y,并将结果入栈。
    后缀表达式示例如下:
    9 3 1 - 3 * + 10 2 / +
    13 445 + 51 / 6 -
    操作数、操作符之间由空格隔开,操作符有 +,-,*, /, %共 5 种符号,所有操作数都为整型。
    栈的定义如下:

    #define Stack_Size 50
    typedef struct{

    ElemType elem[Stack_Size];
    int top;

    }Stack;

    bool push(Stack* S, ElemType x);
    bool pop(Stack* S, ElemType *x);
    void init_stack(Stack *S);

其中,栈初始化的实现为:

void init_stack(Stack *S){
S->top = -1;
}

需要完成的函数定义为:

int compute_reverse_polish_notation(char *str);
函数接收一个字符指针,该指针指向一个字符串形式的后缀表达式,函数返回该表达式的计算结果。

  1. 解析
    Code
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    /*
    * 完成人 :岳昕峰(201909******4)
    * 完成时间:2020-03-23, Mon, 19:19:11
    * 最高分数:100
    */


    #include "list.h" // 请不要删除,否则检查不通过
    #include <stdio.h>
    #include <stdlib.h>

    int compute_reverse_polish_notation(char* str)
    {
    Stack s;
    init_stack(&s);
    int num = 0;
    while (*str != 0) {
    while (*str == ' ')
    str++;
    if (*str == 0) {
    break;
    }
    if (*str == '+') {
    int a, b;
    pop(&s, &a);
    pop(&s, &b);
    push(&s, a + b);
    str++;
    } else if (*str == '-') {
    int a, b;
    pop(&s, &a);
    pop(&s, &b);
    push(&s, b - a);
    str++;
    } else if (*str == '*') {
    int a, b;
    pop(&s, &a);
    pop(&s, &b);
    push(&s, a * b);
    str++;
    } else if (*str == '/') {
    int a, b;
    pop(&s, &a);
    pop(&s, &b);
    push(&s, b / a);
    str++;
    } else if (*str == '%') {
    int a, b;
    pop(&s, &a);
    pop(&s, &b);
    push(&s, b % a);
    str++;
    } else {
    int x = 0;
    do {
    x = x * 10 + *str - '0';
    str++;
    } while (*str >= '0' && *str <= '9' && *str != 0);
    push(&s, x);
    }
    }
    pop(&s, &num);
    return num;
    }

文章作者: Cosmos_F
文章链接: http://fengxinyue.cn/post/4641.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 学习心得
打赏
  • 微信
    微信
  • 支付寶
    支付寶