C语言用指针支持栈

C语言用指针支持栈的完整使用攻略

栈是一种常见的数据结构,在C语言中可以使用指针来支持栈。下面是用指针实现栈的完整使用攻略:

数据结构

栈是一种后进先出(LIFO)的数据结构,可以用数组或链表实现。这里我们使用数组实现栈。

定义栈结构体:

#define MAXSIZE 10 // 栈的容量
typedef struct stack {
    int data[MAXSIZE]; // 存储数据的数组
    int top; // 栈顶指针
} Stack;

data数组用来存储栈中的数据,top指针指向栈顶元素。

核心操作

栈的核心操作有两个:入栈和出栈。

  • 入栈操作

入栈操作将元素压入栈顶,同时将栈顶指针向上移动一个位置。

void push(Stack *s, int value) {
    if (s->top == MAXSIZE) {
        printf("Stack is full.\n");
        return;
    }
    s->data[s->top++] = value;
}
  • 出栈操作

出栈操作将栈顶元素弹出,同时将栈顶指针向下移动一个位置。

int pop(Stack *s) {
    if (s->top == 0) {
        printf("Stack is empty.\n");
        return -1;
    }
    return s->data[--s->top];
}

示例说明

下面是两个示例,说明如何使用指针实现栈。

示例1:使用栈计算表达式

将中缀表达式转换为后缀表达式,再根据后缀表达式计算结果。中缀表达式需要使用栈来转换为后缀表达式,后缀表达式需要使用栈来计算。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h> // 包含isdigit()函数

#define MAXSIZE 10

typedef struct stack {
    int data[MAXSIZE];
    int top;
} Stack;

int priority(char c) { // 计算运算符优先级
    if (c == '(') {
        return 0;
    } else if (c == '+' || c == '-') {
        return 1;
    } else if (c == '*' || c == '/') {
        return 2;
    } else {
        return -1; // 非法运算符
    }
}

void infix_to_postfix(char *infix, char *postfix) {
    Stack s;
    s.top = 0;
    int i = 0, j = 0;
    char c;

    while ((c = infix[i++]) != '\0') {
        if (isdigit(c)) {
            postfix[j++] = c; // 直接输出数字
        } else if (c == '(') {
            push(&s, c); // 左括号入栈
        } else if (c == ')') {
            while ((c = pop(&s)) != '(') {
                postfix[j++] = c; // 弹出栈顶运算符并输出
            }
        } else if (c == '+' || c == '-' || c == '*' || c == '/') {
            while (s.top != 0 && priority(c) <= priority(s.data[s.top-1])) {
                postfix[j++] = pop(&s); // 弹出栈顶运算符并输出
            }
            push(&s, c); // 运算符入栈
        } else {
            printf("Invalid input.\n");
            exit(EXIT_FAILURE);
        }
    }

    while (s.top != 0) {
        postfix[j++] = pop(&s); // 弹出栈中剩余的运算符并输出
    }
    postfix[j] = '\0';
}

int calculate(char *postfix) {
    Stack s;
    s.top = 0;
    int i = 0, a, b;

    while (postfix[i] != '\0') {
        if (isdigit(postfix[i])) {
            push(&s, postfix[i]-'0'); // 数字直接入栈
        } else {
            b = pop(&s);
            a = pop(&s);
            switch (postfix[i]) { // 计算栈顶两个元素的运算结果
                case '+': push(&s, a+b); break;
                case '-': push(&s, a-b); break;
                case '*': push(&s, a*b); break;
                case '/': push(&s, a/b); break;
                default: printf("Invalid postfix expression.\n"); exit(EXIT_FAILURE);
            }
        }
        i++;
    }

    return pop(&s);
}

int main(void) {
    char infix[MAXSIZE];
    char postfix[MAXSIZE];
    printf("Input an infix expression: ");
    fgets(infix, MAXSIZE, stdin);
    infix_to_postfix(infix, postfix);
    printf("The postfix expression is: %s\n", postfix);
    printf("The result is: %d\n", calculate(postfix));
    return 0;
}

示例2:使用栈判断括号是否匹配

#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 10

typedef struct stack {
    char data[MAXSIZE];
    int top;
} Stack;

int is_left_bracket(char c) {
    return (c == '(' || c == '[' || c == '{');
}

int is_right_bracket(char c) {
    return (c == ')' || c == ']' || c == '}');
}

int match(char left, char right) {
    switch (left) {
        case '(': return (right == ')');
        case '[': return (right == ']');
        case '{': return (right == '}');
        default: return 0;
    }
}

int check_brackets(char *str) {
    Stack s;
    s.top = 0;
    int i = 0;
    char c;

    while ((c = str[i++]) != '\0') {
        if (is_left_bracket(c)) {
            push(&s, c);
        } else if (is_right_bracket(c)) {
            if (s.top == 0 || !match(pop(&s), c)) {
                return 0; // 不匹配
            }
        }
    }

    return (s.top == 0); // 栈为空则匹配
}

int main(void) {
    char str[MAXSIZE];
    printf("Input a string: ");
    fgets(str, MAXSIZE, stdin);
    if (check_brackets(str)) {
        printf("All brackets match.\n");
    } else {
        printf("Not all brackets match.\n");
    }
    return 0;
}

以上就是使用指针实现栈的完整使用攻略,这里只列举了两个简单的示例,实际上栈还可以用来解决很多实际问题,比如回文判断、计算器等。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言用指针支持栈 - Python技术站

(0)
上一篇 2023年5月9日
下一篇 2023年5月9日

相关文章

  • C语言实现BF算法案例详解

    C语言实现BF算法案例详解 什么是BF算法 BF算法是一种简单的字符串匹配算法,它的全称为Brute Force算法,中文翻译为暴力匹配算法。该算法的思想是对匹配串中与主串中的字符逐一进行比较,直到匹配成功或者不匹配结束。 实现BF算法的步骤 步骤一:暴力匹配 我们可以从主串的第一个字符开始,每次匹配一个字符,直到匹配成功或者匹配失败为止。如果匹配成功,就继…

    C 2023年5月22日
    00
  • C语言Easyx实现贪吃蛇详解

    C语言Easyx实现贪吃蛇详解 简介 贪吃蛇是经典的小游戏,此篇攻略详细讲解如何用C语言结合Easyx图形库实现贪吃蛇的效果。 准备工作 安装Easyx Easyx是一款基于C语言的图形库,在此之前需要先下载和安装Easyx。 代码框架 以下是整个贪吃蛇程序的代码框架: #include <graphics.h> //Easyx头文件,必须要含有…

    C 2023年5月23日
    00
  • c语言main函数使用及其参数介绍

    C语言main函数使用及其参数介绍 在C语言程序中,主函数(main函数)是程序的入口,它负责整个程序的执行。main函数的形式如下: int main(int argc, char *argv[]) { //程序语句 return 0; } main函数包括三部分,分别是函数头、函数体和返回值。下面我们对这三部分进行详细介绍。 一、函数头 main函数的函…

    C 2023年5月23日
    00
  • C++实现xml解析器示例详解

    C++实现xml解析器示例详解 什么是XML XML是一种标记语言,用于存储和传输数据。它具有可扩展性、可读性好、结构化等特点,被广泛应用于互联网、移动设备、桌面应用程序等场合。 XML的结构如下: <?xml version="1.0" encoding="UTF-8"?> <root> &l…

    C 2023年5月23日
    00
  • C++中try throw catch异常处理的用法示例

    C++中异常处理是一种用于处理程序运行期间发生的错误或异常情况的机制。一般情况下,C++中的异常处理包括三个关键字:try、throw、catch。 try:try语句块中的代码是需要被监控的代码。当try语句块中的代码抛出异常时,异常会被传递到catch块中进行处理。 throw:throw语句抛出一个异常,它抛出的值可以是任意类型的,包括一个简单的数字类…

    C 2023年5月23日
    00
  • 逍遥自在学C语言 | 赋值运算符

    前言 在C语言中,赋值运算符用于将一个值赋给变量 这个过程分为两个步骤: 计算赋值运算符右侧的表达式 将结果赋给左侧的变量。 C语言提供了多个不同的赋值运算符,包括基本的赋值运算符、复合赋值运算符以及条件赋值运算符等 一、人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 —— 自在。 第二位上场的是和我们一起学习的小白程序猿 —— 逍遥。 二、基本…

    C 2023年4月25日
    00
  • 详解MySQL 数据库隔离级别与MVCC

    详解 MySQL 数据库隔离级别与 MVCC MySQL 是一种开源的关系型数据库管理系统,支持多种隔离级别和多版本并发控制(MVCC)。这篇文章将详细讲解 MySQL 数据库隔离级别和 MVCC 的相关知识。 MySQL 数据库隔离级别 MySQL 数据库支持多种隔离级别,包括读未提交(READ UNCOMMITTED)、读已提交(READ COMMITT…

    C 2023年5月22日
    00
  • 抖音蓝v认证有什么作用?抖音蓝v认证的好处和坏处分析

    抖音蓝v认证有什么作用? 什么是抖音蓝V认证? 抖音蓝V认证是抖音对于特定领域或人群进行身份验证后授予的官方认证标识,代表着用户在该领域具有一定的知名度和影响力。抖音蓝V认证的标志是一个蓝色“V”字,出现在用户个人资料页上方。 抖音蓝V认证有什么作用? 1. 提升用户信任度 在众多抖音用户中,拥有蓝V认证的用户会比普通用户更容易获得其他用户的信任。因为蓝V认…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部