【算法笔记自学】第 7 章 提高篇(1)——数据结构专题(1)

7.1栈的应用

#include <iostream>
#include <string>
#include <stack>
using namespace std;

int main() {
    int n, x;
    string action;
    cin >> n;
    stack<int> s;
    for (int i = 0; i < n; i++) {
        cin >> action;
        if (action == "push") {
            cin >> x;
            s.push(x);
        } else {
            if (s.empty()) {
                cout << -1 << endl;
            } else {
                cout << s.top() << endl;
                s.pop();
            }
        }
    }
    return 0;
}

#include <iostream>
#include <string>
using namespace std;

string toPostfixExpr(string infixExpr) {
    string result = "";
    result += infixExpr[0];
    for (int i = 2; i < infixExpr.length(); i += 4) {
        result += " ";
        result += infixExpr[i + 2];
        result += " ";
        result += infixExpr[i];
    }
    return result;
}

int main() {
    string expr;
    getline(cin, expr);
    cout << toPostfixExpr(expr);
    return 0;
}

#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <stack>
using namespace std;

struct Node {
    int num;
    char op;
    bool isOp;
};

map<char, int> priority;

vector<Node> toNodeVector(string expr) {
    vector<Node> nodes;
    for (int i = 0; i < expr.length(); i++) {
        if (expr[i] == ' ') {
            continue;
        }
        if (expr[i] >= '0' && expr[i] <= '9') {
            Node numNode;
            numNode.isOp = false;
            numNode.num = expr[i] - '0';
            nodes.push_back(numNode);
        } else {
            Node opNode;
            opNode.isOp = true;
            opNode.op = expr[i];
            nodes.push_back(opNode);
        }
    }
    return nodes;
}

vector<Node> toPostfixVector(vector<Node> infix) {
    vector<Node> postfix;
    stack<Node> opStack;
    for (int i = 0; i < infix.size(); i++) {
        if (infix[i].isOp) {
            while (!opStack.empty() && priority[infix[i].op] <= priority[opStack.top().op]) {
                postfix.push_back(opStack.top());
                opStack.pop();
            }
            opStack.push(infix[i]);
        } else {
            postfix.push_back(infix[i]);
        }
    }
    while (!opStack.empty()) {
        postfix.push_back(opStack.top());
        opStack.pop();
    }
    return postfix;
}

int main() {
    priority['+'] = priority['-'] = 0;
    priority['*'] = priority['/'] = 1;
    string expr;
    getline(cin, expr);
    vector<Node> infix = toNodeVector(expr);
    vector<Node> postfix = toPostfixVector(infix);
    for (int i = 0; i < postfix.size(); i++) {
        if (postfix[i].isOp) {
            cout << postfix[i].op;
        } else {
            cout << postfix[i].num;
        }
        if (i < (int)postfix.size() - 1) {
            cout << " ";
        }
    }
    return 0;
}

#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <map>
#include <stack>
using namespace std;

struct Node {
    int num;
    char op;
    bool isOp;
};

map<char, int> priority;

vector<Node> toNodeVector(string expr) {
    vector<Node> nodes;
    for (int i = 0; i < expr.length(); i++) {
        if (expr[i] == ' ') {
            continue;
        }
        if (expr[i] >= '0' && expr[i] <= '9') {
            Node numNode;
            numNode.isOp = false;
            numNode.num = expr[i] - '0';
            nodes.push_back(numNode);
        } else {
            Node opNode;
            opNode.isOp = true;
            opNode.op = expr[i];
            nodes.push_back(opNode);
        }
    }
    return nodes;
}

double eval(vector<Node> postfix) {
    stack<double> numStack;
    for (int i = 0; i < postfix.size(); i++) {
        if (!postfix[i].isOp) {
            numStack.push(postfix[i].num);
        } else {
            double num2 = numStack.top();
            numStack.pop();
            double num1 = numStack.top();
            numStack.pop();
            if (postfix[i].op == '+') {
                numStack.push(num1 + num2);
            } else if (postfix[i].op == '-') {
                numStack.push(num1 - num2);
            } if (postfix[i].op == '*') {
                numStack.push(num1 * num2);
            } if (postfix[i].op == '/') {
                numStack.push(num1 / num2);
            }
        }
    }
    return numStack.top();
}

int main() {
    priority['+'] = priority['-'] = 0;
    priority['*'] = priority['/'] = 1;
    string expr;
    getline(cin, expr);
    vector<Node> postfix = toNodeVector(expr);
    printf("%.2f", eval(postfix));
    return 0;
}

#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <stack>
using namespace std;

struct Node {
    int num;
    char op;
    bool isOp;
};

map<char, int> priority;

vector<Node> toNodeVector(string expr) {
    vector<Node> nodes;
    for (int i = 0; i < expr.length(); i++) {
        if (expr[i] == ' ') {
            continue;
        }
        if (expr[i] >= '0' && expr[i] <= '9') {
            Node numNode;
            numNode.isOp = false;
            numNode.num = expr[i] - '0';
            nodes.push_back(numNode);
        } else {
            Node opNode;
            opNode.isOp = true;
            opNode.op = expr[i];
            nodes.push_back(opNode);
        }
    }
    return nodes;
}

vector<Node> toPostfixVector(vector<Node> infix) {
    vector<Node> postfix;
    stack<Node> opStack;
    for (int i = 0; i < infix.size(); i++) {
        if (infix[i].isOp) {
            while (!opStack.empty() && priority[infix[i].op] <= priority[opStack.top().op]) {
                postfix.push_back(opStack.top());
                opStack.pop();
            }
            opStack.push(infix[i]);
        } else {
            postfix.push_back(infix[i]);
        }
    }
    while (!opStack.empty()) {
        postfix.push_back(opStack.top());
        opStack.pop();
    }
    return postfix;
}

double eval(vector<Node> postfix) {
    stack<double> numStack;
    for (int i = 0; i < postfix.size(); i++) {
        if (!postfix[i].isOp) {
            numStack.push(postfix[i].num);
        } else {
            double num2 = numStack.top();
            numStack.pop();
            double num1 = numStack.top();
            numStack.pop();
            if (postfix[i].op == '+') {
                numStack.push(num1 + num2);
            } else if (postfix[i].op == '-') {
                numStack.push(num1 - num2);
            } if (postfix[i].op == '*') {
                numStack.push(num1 * num2);
            } if (postfix[i].op == '/') {
                numStack.push(num1 / num2);
            }
        }
    }
    return numStack.top();
}

int main() {
    priority['+'] = priority['-'] = 0;
    priority['*'] = priority['/'] = 1;
    string expr;
    getline(cin, expr);
    vector<Node> infix = toNodeVector(expr);
    vector<Node> postfix = toPostfixVector(infix);
    printf("%.2f", eval(postfix));
    return 0;
}

7.2队列的应用

#include <iostream>
#include <string>
#include <queue>
using namespace std;

int main() {
    int n, k;
    cin >> n;
    string action;
    queue<int> q;
    for (int i = 0; i < n; i++) {
        cin >> action;
        if (action == "push") {
            cin >> k;
            q.push(k);
        } else {
            if (q.empty()) {
                cout << -1 << endl;
            } else {
                cout << q.front() << endl;
                q.pop();
            }
        }
    }
    return 0;
}

#include <cstdio>
#include <queue>
using namespace std;

int main() {
    int n, x;
    scanf("%d", &n);
    queue<int> q;
    for (int i = 0; i < n; i++) {
        scanf("%d", &x);
        q.push(x);
    }
    while (q.size() > 1) {
        int front1 = q.front();
        q.pop();
        int front2 = q.front();
        q.pop();
        q.push(front1 + front2);
    }
    printf("%d", q.front());
    return 0;
}

#include <cstdio>
#include <queue>
using namespace std;

int main() {
    int n, k;
    scanf("%d%d", &n, &k);
    queue<int> q;
    for (int i = 1; i <= n; i++) {
        q.push(i);
    }
    while (!q.empty()) {
        for (int i = 0; i < k - 1; i++) {
            int front = q.front();
            q.pop();
            q.push(front);
        }
        printf("%d", q.front());
        q.pop();
        if (!q.empty()) {
            printf(" ");
        }
    }
    return 0;
}

7.3链表处理

#include <cstdio>

const int MAXN = 100;

struct Node {
    int data, next;
} nodes[MAXN];

int main() {
    int n, first, id;
    scanf("%d%d", &n, &first);
    for (int i = 0; i < n; i++) {
        scanf("%d", &id);
        scanf("%d%d", &nodes[id].data, &nodes[id].next);
    }
    int current = first;
    while (current != -1) {
        printf("%d %d %d\n", current, nodes[current].data, nodes[current].next);
        current = nodes[current].next;
    }
    return 0;
}

#include <cstdio>

const int MAXN = 100;

struct Node {
    int data, next;
} nodes[MAXN];

int main() {
    int n, first, id;
    scanf("%d%d", &n, &first);
    for (int i = 0; i < n; i++) {
        scanf("%d", &id);
        scanf("%d%d", &nodes[id].data, &nodes[id].next);
    }
    int current = first;
    int num=0;
    while (current != -1) {
        //printf("%d %d %d\n", current, nodes[current].data, nodes[current].next);
        current = nodes[current].next;
        num++;
    }
    printf("%d",num);
    return 0;
}

#include <cstdio>

const int MAXN = 1024;

struct Node {
    int data, next;
} nodes[MAXN];

int main() {
    int n, first, id;
    scanf("%d%d", &n, &first);
    for (int i = 0; i < n; i++) {
        scanf("%d", &id);
        scanf("%d%d", &nodes[id].data, &nodes[id].next);
    }
    int num=0;
    int current = first;
    scanf("%d",&num);
    for (int i = 0; i < num; i++) {
        scanf("%d", &id);
        scanf("%d", &nodes[id].data);
        nodes[id].next=current;
        current=id;
    }
    while (current != -1) {
        printf("%d %d %d\n", current, nodes[current].data, nodes[current].next);
        current = nodes[current].next;
    }
    return 0;
}

#include <cstdio>

const int MAXN = 100;

struct Node {
    int data, next;
} nodes[MAXN];

int main() {
    int n, first, k, id;
    scanf("%d%d%d", &n, &first, &k);
    for (int i = 0; i < n; i++) {
        scanf("%d", &id);
        scanf("%d%d", &nodes[id].data, &nodes[id].next);
    }
    int current = first, last = 0;
    while (current != -1) {
        if (nodes[current].data == k) {
            if (current == first) {
                first = nodes[current].next;
            }
            nodes[last].next = nodes[current].next;
            current = nodes[last].next;
        } else {
            last = current;
            current = nodes[current].next;
        }
    }
    current = first;
    while (current != -1) {
        printf("%d %d %d\n", current, nodes[current].data, nodes[current].next);
        current = nodes[current].next;
    }
    return 0;
}

#include <cstdio>

const int MAXN = 100;

struct Node {
    int data, next;
} nodes[MAXN];

int main() {
    int n, first, id;
    scanf("%d%d", &n, &first);
    for (int i = 0; i < n; i++) {
        scanf("%d", &id);
        scanf("%d%d", &nodes[id].data, &nodes[id].next);
    }
    int current = first, last = -1;
    while (current != -1) {
        int next = nodes[current].next;
        nodes[current].next = last;
        last = current;
        current = next;
    }
    current = last;
    while (current != -1) {
        printf("%d %d %d\n", current, nodes[current].data, nodes[current].next);
        current = nodes[current].next;
    }
    return 0;
}

#include <cstdio>

const int MAXN = 100;
const int MAXV = 1000 + 1;

struct Node {
    int data, next;
} nodes[MAXN];

bool needDelete[MAXV] = {false};

int main() {
    int n, first, id;
    scanf("%d%d", &n, &first);
    for (int i = 0; i < n; i++) {
        scanf("%d", &id);
        scanf("%d%d", &nodes[id].data, &nodes[id].next);
    }
    int current = first, last = -1;
    while (current != -1) {
        if (needDelete[nodes[current].data]) {
            nodes[last].next = nodes[current].next;
            current = nodes[current].next;
        } else {
            needDelete[nodes[current].data] = true;
            last = current;
            current = nodes[current].next;
        }
    }
    current = first;
    while (current != -1) {
        printf("%d %d %d\n", current, nodes[current].data, nodes[current].next);
        current = nodes[current].next;
    }
    return 0;
}

#include <cstdio>

const int MAXN = 100;

struct Node {
    int data, next;
} nodes[MAXN];

int main() {
    int n, first, id;
    scanf("%d%d", &n, &first);
    for (int i = 0; i < n; i++) {
        scanf("%d", &id);
        scanf("%d%d", &nodes[id].data, &nodes[id].next);
    }
    int fast = first, slow = first;
    while (nodes[fast].next != -1 && nodes[nodes[fast].next].next != -1) {
        slow = nodes[slow].next;
        fast = nodes[fast].next;
        fast = nodes[fast].next;
    }
    if (nodes[fast].next == -1) {
        printf("%.1f", (double)nodes[slow].data);
    } else {
        printf("%.1f", (nodes[slow].data + nodes[nodes[slow].next].data) / 2.0);
    }
    return 0;
}

#include <cstdio>

const int MAXN = 100;

struct Node {
    int data, next;
} nodes[MAXN];

int main() {
    int n, first, k, id;
    scanf("%d%d%d", &n, &first, &k);
    for (int i = 0; i < n; i++) {
        scanf("%d", &id);
        scanf("%d%d", &nodes[id].data, &nodes[id].next);
    }
    int fast = first;
    while (k--) {
        fast = nodes[fast].next;
    }
    int slow = first;
    while (fast != -1) {
        slow = nodes[slow].next;
        fast = nodes[fast].next;
    }
    printf("%d %d %d", slow, nodes[slow].data, nodes[slow].next);
    return 0;
}

#include <cstdio>

const int MAXN = 100;

struct Node {
    int data, next;
} nodes[MAXN];

int reverseList(int first) {
    int current = first, last = -1;
    while (current != -1) {
        int next = nodes[current].next;
        nodes[current].next = last;
        last = current;
        current = next;
    }
    return last;
}

bool judgePalindrome(int head1, int head2) {
    while (head2 != -1) {
        if (nodes[head1].data != nodes[head2].data) {
            return false;
        }
        head1 = nodes[head1].next;
        head2 = nodes[head2].next;
    }
    return true;
}

int main() {
    int n, first, id;
    scanf("%d%d", &n, &first);
    for (int i = 0; i < n; i++) {
        scanf("%d", &id);
        scanf("%d%d", &nodes[id].data, &nodes[id].next);
    }
    int fast = first, slow = first;
    while (nodes[fast].next != -1 && nodes[nodes[fast].next].next != -1) {
        slow = nodes[slow].next;
        fast = nodes[fast].next;
        fast = nodes[fast].next;
    }
    int headOfSecondPart = reverseList(nodes[slow].next);
    bool isPalindrome = judgePalindrome(first, headOfSecondPart);
    nodes[slow].next = reverseList(headOfSecondPart);
    printf(isPalindrome ? "Yes" : "No");
    return 0;
}

上一篇:VSCode神仙插件——通义灵码 (AI编程助手)


下一篇:【YOLOv5进阶】——替换主干网络(backbone)-MobileNet为例