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++进行对象排序的话,我们就需要重载运算符以定义对象之间的大小关系。 具体来说,我们需要重载的运算符是小于号 <,这个运算符可以用于比较两个对象的大小,从而进行排序。 下面是一个示例: class Person { public: string name; int age; bool op…

    C 2023年5月22日
    00
  • C++实现延迟的方法详解

    C++实现延迟的方法详解 在C++编程中,我们经常需要实现延迟的效果。比如等待一定时间后再执行某个动作,或者在某个时间点执行某个动作。本文将介绍几种实现延迟的方法,并附带示例说明。 方法一:使用sleep函数 sleep函数可以让当前线程暂停一定的时间,然后再继续执行。其原型为: unsigned int sleep(unsigned int seconds…

    C 2023年5月22日
    00
  • VScode编译C++ 头文件显示not found的问题

    当使用VScode编译C++程序时,有时会出现头文件找不到的问题。这是因为VScode默认的编译器路径可能与系统的编译器路径不一致,从而导致编译器无法找到头文件。下面就详细介绍如何解决这个问题: 步骤一:打开VScode设置 首先,在VScode中按下Ctrl + ,快捷键或者点击左侧的“文件夹”按钮,然后选择“首选项” => “设置”,进入设置页面。…

    C 2023年5月23日
    00
  • 常用的C语言编程工具汇总

    常用的C语言编程工具汇总 概述 C语言是一种非常流行的高级编程语言,开发者们常常使用各种工具来编写、调试、测试他们的C代码。在这里我们进行简单的介绍,列出一些主要的C语言编程工具及其用途。 编辑器 编辑器是C语言编程过程中最基本的工具之一。通常用来编写代码。常用的C语言编辑器有: 1. Visual Studio Code Visual Studio Cod…

    C 2023年5月23日
    00
  • C++、C语言和JAVA开发的区别

    C++、C语言和JAVA都是流行的编程语言,各自有其独特的特点和用途。下面将分别对三者进行详细讲解。 C++ C++是一种面向对象编程语言,它是在C语言的基础上发展而来的。C++是广泛用于系统软件、游戏开发和嵌入式开发的语言。与C语言相比,C++有更多的抽象和封装概念,能够实现更加复杂的功能。 在C++中,通常会使用类来封装数据和方法,这样可以实现数据的隐藏…

    C 2023年5月23日
    00
  • VSCode搭建STM32开发环境的方法步骤

    下面我将详细讲解“VSCode搭建STM32开发环境的方法步骤”。本攻略主要分为以下四个步骤:安装基础工具、配置VSCode环境、安装STM32插件和调试程序。 步骤一:安装基础工具 在搭建STM32开发环境前,我们需要安装以下几个工具: 集成开发环境(IDE):STM32CubeIDE、Keil、IAR、System Workbench for STM32…

    C 2023年5月22日
    00
  • C语言中函数栈帧的创建和销毁的深层分析

    C语言中函数栈帧的创建和销毁的深层分析 什么是函数栈帧 在C语言中,每当一个函数被调用时,系统会在当前线程的栈上为该函数创建一个栈帧(Stack Frame),用于保存该函数调用时的现场信息(如首地址、传递参数、局部变量等信息)。函数栈帧的创建和销毁是函数调用的必要过程,也是C语言程序的基本运行机制之一。 函数栈帧的创建过程 函数栈帧的创建过程分为以下几个步…

    C 2023年5月23日
    00
  • C++隐式转换问题分析及解决办法

    C++隐式转换问题分析及解决办法 背景 C++是一门强类型语言,变量必须先定义类型才能使用,这样可以提高代码的可靠性和执行效率。但在一些情况下,C++的强类型编程方式反而降低了编码的便利性和灵活性。因此,C++提供了隐式类型转换(implicit type conversion)机制,可以方便地将一种类型的变量转换成另一种类型的变量,这也是C++语言的特性之…

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