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语言实现学生宿舍信息管理系统课程设计

    C语言实现学生宿舍信息管理系统课程设计攻略 一、需求分析 首先对实现学生宿舍信息管理系统进行需求分析,需要考虑以下几个方面: 数据存储和管理。需要设计存储和管理学生基本信息、宿舍信息、楼栋信息等相关数据的方法。 功能模块划分。需要划分主要功能模块,如学生信息管理、宿舍信息管理、楼栋信息管理等,并确定每个模块的具体功能和交互方式。 系统性能和稳定性。需要考虑系…

    C 2023年5月23日
    00
  • python中常用的各种数据库操作模块和连接实例

    连接数据库是Python中非常重要的操作之一。Python中有很多数据库操作模块,比如官方的sqlite3模块,以及第三方的MySQLdb和pymongo等模块。下面就对这些模块及其使用做一个详细的介绍和示例说明。 sqlite3模块 官方sqlite3模块是Python内置的模块,它可以通过Python与SQLite数据库进行交互。它允许我们执行SQL语句…

    C 2023年5月23日
    00
  • Ruby和Ruby on Rails中解析JSON格式数据的实例教程

    Ruby和Ruby on Rails中解析JSON格式数据的实例教程 1. 概述 JSON是一种轻量级的数据交换格式,广泛应用于数据传输和信息交换的场合。 Ruby和Ruby on Rails都提供了强大的JSON解析库,可以快速、简便地对JSON格式数据进行解析和生成。本文将以实例的方式演示在Ruby和Ruby on Rails中解析JSON格式数据的方法…

    C 2023年5月23日
    00
  • Go与C语言的互操作实现

    Go与C语言的互操作实现 Go是一门高效、安全、并发的编程语言,但是它的标准库并不像其他语言那么丰富。许多功能需要引入外部库才能实现。而C语言则是一门底层语言,有很多底层的库和功能。所以在一些特定场景下,我们需要使用Go与C语言相互协作来实现这些功能。本文将会详细讲解如何在Go程序中集成C代码。 Go的C语言接口 Go与C语言之间的交互主要是通过C语言接口实…

    C 2023年5月23日
    00
  • Vue element ui用户展示页面的实例

    下面我将为你详细讲解“Vue element ui用户展示页面的实例”的完整攻略。 1. 环境配置 在开始使用Vue element ui之前,需要先进行环境配置。具体操作步骤如下: 安装Node.js:在Node.js官网下载对应系统的安装包,安装完成后,在命令行中输入node -v查看是否安装成功; 安装Vue CLI:在命令行中输入npm instal…

    C 2023年5月23日
    00
  • javascript跨域方法、原理以及出现问题解决方法(详解)

    让我来详细讲解一下“javascript跨域方法、原理以及出现问题解决方法(详解)”。 什么是跨域 在浏览器中,当页面A通过请求其他域下的页面B中的资源时,浏览器会提示跨域错误,这时候就涉及到了跨域问题。一般来说跨域指的是协议、域名、端口号中任意一个不同就会造成跨域问题。 跨域解决方法 JSONP JSONP是通过在页面中插入一个script标签,通过获取一…

    C 2023年5月23日
    00
  • C语言与C++中内存管理详解

    C语言与C++中内存管理详解 内存管理是C语言和C++中非常重要的一部分,正确的内存管理可以避免内存泄漏和内存溢出等问题,从而提高程序的稳定性和性能。本文将详细介绍C语言和C++中的内存管理技巧和注意事项。 内存分配和释放 在C语言和C++中,内存分配和释放是通过动态内存管理函数来实现的。C语言中的动态内存管理函数包括malloc()、calloc()和re…

    C 2023年5月22日
    00
  • VC程序设计小技巧20例

    “VC程序设计小技巧20例”完整攻略 简介 VC程序设计小技巧20例是VC++程序设计中常用的技巧总结,适合于从事VC++开发者,主要包括优化技巧、调试技巧、安全技巧等。以下是详细的攻略总结。 1. 使用switch代替if语句 if语句在判断多个变量时效率低下,可以使用switch代替,代码如下: char c; cin >> c; switc…

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