【数据结构】利用顺序栈/链栈完成表达式求值(C语言实现)

这篇具有很好参考价值的文章主要介绍了【数据结构】利用顺序栈/链栈完成表达式求值(C语言实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

利用顺序栈完成表达式求值(将字符型转换为整型)

程序代码:

#include <stdio.h>

#include <malloc.h>

#include <stdlib.h>

#include <math.h>

#define MAXSIZE 100

#define ElemType char

#define LEN sizeof(ElemType)

typedef struct{

    ElemType* data;

    int top;

}SqStack;

void InitStack(SqStack* S)

{

    S->data = (ElemType*)malloc(MAXSIZE * LEN);

    if (S->data == NULL)

         exit(0);

    S->top = 0;

}

int StackEmpty(SqStack* S) {

    if (S->top == 0)

         return 1;

    else

         return 0;

}

int StackFull(SqStack* S) {

    if (S->top == MAXSIZE)

         return 1;

    else

         return 0;

}

int Push(SqStack* S, ElemType x) {

    if (StackFull(S))

         return 0;

    S->data[S->top] = x;

    (S->top)++;

    return 1;

}

ElemType Pop(SqStack* S) {

    ElemType x;

    if (StackEmpty(S))

         return 0;

    --(S->top);

    x = S->data[S->top];

    return x;

}

ElemType GetTop(SqStack* S) {

    ElemType x;

    if (StackEmpty(S))

         return 0;

    x = S->data[(S->top) - 1];

    return x;

}

int IfOptr(char c) {

    switch (c) {

    case '+':

    case '-':

    case '*':

    case '/':

    case '(':

    case ')':

    case '#':return 1;

    default:return 0;

    }

}

char Operate(ElemType a_c, ElemType op, ElemType b_c) {

    int a = a_c - '0';

    int b = b_c - '0';

    switch (op) {

    case '+': {int x = a + b;  return (x + 48); }

    case '-': {int x = a - b;  return (x + 48); }

    case '*': {int x = a * b;  return (x + 48); }

    case '/': {int x = a / b;  return (x + 48); }

    default:exit(1);

    }

}

char Precede(char c1, char c2)

{

    int c_temp1,c_temp2;

    switch (c1)

    {

    case '*':

    case '/':c_temp1 = 4; break;

    case '+':

    case '-':c_temp1 = 2; break;

    case '(':c_temp1 = 0; break;

    case ')':c_temp1 = 5; break;

    case '#':c_temp1 = -1;

    }

    switch (c2)

    {

    case '*':

    case '/': c_temp2 = 3; break;

    case '+':

    case '-': c_temp2 = 1; break;

    case '(': c_temp2 = 5; break;

    case ')': c_temp2 = 0; break;

    case '#': c_temp2 = -1;

    }

    if (c_temp1<c_temp2)

         return('<');

    else if(c_temp1==c_temp2)

         return('=');

    else

         return('>');

}

int main() {

    SqStack* OPTR= (SqStack*)malloc(sizeof(SqStack));

    SqStack* OPND= (SqStack*)malloc(sizeof(SqStack));

    char c;

    InitStack(OPTR);

    Push(OPTR, '#');

    InitStack(OPND);

    c = getchar();

    while (c != '#' || GetTop(OPTR) != '#') {

         if (!IfOptr(c)) {

             Push(OPND, c);

             c = getchar();

         }

         else

             switch (Precede(GetTop(OPTR),c)) {

             case '<':

                  Push(OPTR, c);

                  c = getchar();

                  break;

             case '=':

             {

                  ElemType x = Pop(OPTR);

                  c = getchar();

                  break;

             }

             case  '>':

             {

                  ElemType op = Pop(OPTR);

                  ElemType b = Pop(OPND);

                  ElemType a = Pop(OPND);

                  Push(OPND,Operate(a, op, b));

                  break;

             }

             }

    }

    printf("%c",GetTop(OPND));

}

运行截图:

利用栈表达式求值c语言代码,数据结构基础,数据结构,c语言,算法

利用顺序栈完成表达式求值(创建字符型、整型两种栈)

程序代码:

SqStackInt.h

#include <stdio.h>

#include <malloc.h>

#include <stdlib.h>

#define MAXSIZE 100

typedef struct {

    int* data;

    int top;

}SqStackInt;

void InitStack_Int(SqStackInt* S)

{

    S->data = (int*)malloc(MAXSIZE * sizeof(int));

    if (S->data == NULL)

         exit(0);

    S->top = 0;

}

int StackEmpty_Int(SqStackInt* S) {

    if (S->top == 0)

         return 1;

    else

         return 0;

}

int StackFull_Int(SqStackInt* S) {

    if (S->top == MAXSIZE)

         return 1;

    else

         return 0;

}

int Push_Int(SqStackInt* S, int x) {

    if (StackFull_Int(S))

         return 0;

    S->data[S->top] = x;

    (S->top)++;

    return 1;

}

int Pop_Int(SqStackInt* S) {

    int x;

    if (StackEmpty_Int(S))

         return 0;

    --(S->top);

    x = S->data[S->top];

    return x;

}

int GetTop_Int(SqStackInt* S) {

    int x;

    if (StackEmpty_Int(S))

         return 0;

    x = S->data[(S->top) - 1];

    return x;

}

SqStackChar.h

#include <stdio.h>

#include <malloc.h>

#include <stdlib.h>

#define MAXSIZE 100

typedef struct {

    char* data;

    int top;

}SqStackChar;

void InitStack_Char(SqStackChar* S)

{

    S->data = (char*)malloc(MAXSIZE * sizeof(char));

    if (S->data == NULL)

         exit(0);

    S->top = 0;

}

int StackEmpty_Char(SqStackChar* S) {

    if (S->top == 0)

         return 1;

    else

         return 0;

}

int StackFull_Char(SqStackChar* S) {

    if (S->top == MAXSIZE)

         return 1;

    else

         return 0;

}

int Push_Char(SqStackChar* S, char x) {

    if (StackFull_Char(S))

         return 0;

    S->data[S->top] = x;

    (S->top)++;

    return 1;

}

char Pop_Char(SqStackChar* S) {

    char x;

    if (StackEmpty_Char(S))

         return 0;

    --(S->top);

    x = S->data[S->top];

    return x;

}

char GetTop_Char(SqStackChar* S) {

    char x;

    if (StackEmpty_Char(S))

         return 0;

    x = S->data[(S->top) - 1];

    return x;

}

Main.cpp

#include <stdio.h>

#include <malloc.h>

#include <stdlib.h>

#include "SqStackChar.h"

#include "SqStackInt.h"

int IfOptr(char c) {

    switch (c) {

    case '+':

    case '-':

    case '*':

    case '/':

    case '(':

    case ')':

    case '#':return 1;

    default:return 0;

    }

}

char Operate( int a, char op, int b) {

    switch (op) {

    case '+': return (a + b);

    case '-': return (a - b);

    case '*': return (a * b);

    case '/': return (a / b);

    default:exit(1);

    }

}

char Precede(char c1, char c2)

{

    int c_temp1, c_temp2;

    switch (c1)

    {

    case '*':

    case '/':c_temp1 = 4; break;

    case '+':

    case '-':c_temp1 = 2; break;

    case '(':c_temp1 = 0; break;

    case ')':c_temp1 = 5; break;

    case '#':c_temp1 = -1;

    }

    switch (c2)

    {

    case '*':

    case '/': c_temp2 = 3; break;

    case '+':

    case '-': c_temp2 = 1; break;

    case '(': c_temp2 = 5; break;

    case ')': c_temp2 = 0; break;

    case '#': c_temp2 = -1;

    }

    if (c_temp1 < c_temp2)

         return('<');

    else if (c_temp1 == c_temp2)

         return('=');

    else

         return('>');

}

int main() {

    SqStackChar* OPTR = (SqStackChar*)malloc(sizeof(SqStackChar));

    SqStackInt* OPND = (SqStackInt*)malloc(sizeof(SqStackInt));

    char c;

    InitStack_Char(OPTR);

    Push_Char(OPTR, '#');

    InitStack_Int(OPND);

    c = getchar();

    while (c != '#' || GetTop_Char(OPTR) != '#') {

         if (!IfOptr(c)) {

             int n = c - '0';

             Push_Int(OPND, n);

             c = getchar();

         }

         else

             switch (Precede(GetTop_Char(OPTR), c)) {

             case '<':

                  Push_Char(OPTR, c);

                  c = getchar();

                  break;

             case '=':

             {

                  char x = Pop_Char(OPTR);

                  c = getchar();

                  break;

             }

             case  '>':

             {

                  char op = Pop_Char(OPTR);

                  int b = Pop_Int(OPND);

                  int a = Pop_Int(OPND);

                  Push_Int(OPND, Operate(a, op, b));

                  break;

             }

             }

    }

    printf("%d", GetTop_Int(OPND));

}

运行截图:

利用栈表达式求值c语言代码,数据结构基础,数据结构,c语言,算法

利用链栈完成表达式求值(创建字符型、整型两种栈)

程序代码:

LinkStackInt.h

#include<stdio.h>

#include<stdlib.h>

#include<malloc.h>

typedef struct StackNodeInt {

    int data;

    struct StackNodeInt* link;

}StackNodeInt;

StackNodeInt* InitStack_Int() {

    StackNodeInt* top = (StackNodeInt*)malloc(sizeof(StackNodeInt));

    if (top == NULL) {

         printf("动态空间分配失败!");

         exit(-1);

    }

    top->link = NULL;

    return(top);

}

int StackEmpty_Int(StackNodeInt* top) {

    if (top->link == NULL)

         return 1;

    else

         return 0;

}

void Push_Int(StackNodeInt* top, int x) {

    StackNodeInt* p = (StackNodeInt*)malloc(sizeof(StackNodeInt));

    if (p == NULL) {

         printf("动态空间分配失败!");

         exit(-1);

    }

    p->link = top->link;

    p->data = x;

    top->link = p;

}

int Pop_Int(StackNodeInt* top) {

    if (StackEmpty_Int(top)) { exit(-1); }

    StackNodeInt* p;

    p = top->link;

    int x = p->data;

    top->link = p->link;

    free(p);

    return x;

}

int GetTop_Int(StackNodeInt* top) {

    if (StackEmpty_Int(top)) { return 0; }

    int x = top->link->data;

    return x;

}

LinkStackChar.h

#include<stdio.h>

#include<stdlib.h>

#include<malloc.h>

typedef struct StackNodeChar {

    char data;

    struct StackNodeChar* link;

}StackNodeChar;

StackNodeChar* InitStack_Char() {

    StackNodeChar* top= (StackNodeChar*)malloc(sizeof(StackNodeChar));

    if (top == NULL) {

         printf("动态空间分配失败!");

         exit(-1);

    }

    top->link = NULL;

    return(top);

}

int StackEmpty_Char(StackNodeChar* top) {

    if (top->link == NULL)

         return 1;

    else

         return 0;

}

void Push_Char(StackNodeChar* top,char x) {

    StackNodeChar* p = (StackNodeChar*)malloc(sizeof(StackNodeChar));

    if (p == NULL) {

         printf("动态空间分配失败!");

         exit(-1);

    }

    p->link = top->link;

    p->data = x;

    top->link = p;

}

char Pop_Char(StackNodeChar* top) {

    if (StackEmpty_Char(top)) { exit(-1); }

    StackNodeChar* p;

    p = top->link;

    char x = p->data;

    top->link = p->link;

    free(p);

    return x;

}

char GetTop_Char(StackNodeChar* top) {

    if (StackEmpty_Char(top)) { return 0; }

    char x = top->link->data;

    return x;

}

Main.cpp

#include <stdio.h>

#include <malloc.h>

#include <stdlib.h>

#include "LinkStackChar.h"

#include "LinkStackInt.h"

int IfOptr(char c) {

    switch (c) {

    case '+':

    case '-':

    case '*':

    case '/':

    case '(':

    case ')':

    case '#':return 1;

    default:return 0;

    }

}

char Operate(int a, char op, int b) {

    switch (op) {

    case '+': return (a + b);

    case '-': return (a - b);

    case '*': return (a * b);

    case '/': return (a / b);

    default:exit(1);

    }

}

char Precede(char c1, char c2)

{

    int c_temp1, c_temp2;

    switch (c1)

    {

    case '*':

    case '/':c_temp1 = 4; break;

    case '+':

    case '-':c_temp1 = 2; break;

    case '(':c_temp1 = 0; break;

    case ')':c_temp1 = 5; break;

    case '#':c_temp1 = -1;

    }

    switch (c2)

    {

    case '*':

    case '/': c_temp2 = 3; break;

    case '+':

    case '-': c_temp2 = 1; break;

    case '(': c_temp2 = 5; break;

    case ')': c_temp2 = 0; break;

    case '#': c_temp2 = -1;

    }

    if (c_temp1 < c_temp2)

         return('<');

    else if (c_temp1 == c_temp2)

         return('=');

    else

         return('>');

}

int main() {

    char c;

    StackNodeChar* OPTR = InitStack_Char();

    Push_Char(OPTR, '#');

    StackNodeInt* OPND=InitStack_Int();

    c = getchar();

    while (c != '#' || GetTop_Char(OPTR) != '#') {

         if (!IfOptr(c)) {

             int n = c - '0';

             Push_Int(OPND, n);

             c = getchar();

         }

         else

             switch (Precede(GetTop_Char(OPTR), c)) {

             case '<':

                  Push_Char(OPTR, c);

                  c = getchar();

                  break;

             case '=':

             {

                  char x = Pop_Char(OPTR);

                  c = getchar();

                  break;

             }

             case  '>':

             {

                  char op = Pop_Char(OPTR);

                  int b = Pop_Int(OPND);

                  int a = Pop_Int(OPND);

                  Push_Int(OPND, Operate(a, op, b));

                  break;

             }

             }

    }

    printf("%d", GetTop_Int(OPND));

}

运行截图:

利用栈表达式求值c语言代码,数据结构基础,数据结构,c语言,算法

实验小结

① 了解掌握整型数据与字符型的转化规则

在“利用顺序栈完成表达式求值(将字符型转换为整型)”实验中,因为我只创建了字符栈,所以只能将数据作为字符存放在字符栈中,而作为字符型数据存储的数字不能计算出正确结果,所以必须在计算前,将作为字符存放的数字转换为整型数据。那如何转换呢?举个例子: ‘1’的ASCII 值为 49;‘0’的ASCII 值为 48;‘1’-‘0’=1;‘0’是一个char类型的字符,其ASCII码就是一个int型的数字48,在运算过程中等同于int。所以将字符型数字‘1’转化为 整型数字1:‘1’-‘0’=1相当于49-48 = 1。

② 时刻警惕“野指针”

在程序编写完成后,调试过程中却不断报错:“C4700:使用了未初始化的局部变量‘OPTR’和‘OPRD’”,在查阅资料并多番询问后。最终找出错误:缺少如下代码:

SqStack* OPTR = (SqStack*)malloc(sizeof(SqStack));

SqStack* OPND = (SqStack*)malloc(sizeof(SqStack));

换言之,我在初始化OPTR和OPND两个顺序栈的指针时,没有给指针分配地址空间,而让他们成为“野指针”。我一直存在一个思维误区:我需要开辟空间给栈存放数据,并将栈的地址返回给它的指针,也就是OPTR和OPTD。存放数据固然要开辟空间,但是存放这些数据的地址也同样要开辟空间。我就是因为没有给栈的地址开辟空间存放而报错。之后的编程,要时刻警惕野指针的存在。

③ 自定义头文件

如果在一个文件中,写上成百上千行的代码,这些代码阅读起来就会很麻烦。因此,我们可以引入头文件,把自己写的函数放入头文件中,然后直接调用到主程序中,这样在主程序中看起来就比较清晰。本次实验,我将栈的定义及其相关操作单独放在一个头文件中,并在主程序的头部调用,这样主程序就只剩下与计算相关的函数,整个程序脉络更为清晰,可读性更高。文章来源地址https://www.toymoban.com/news/detail-745519.html

到了这里,关于【数据结构】利用顺序栈/链栈完成表达式求值(C语言实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】链栈的基本操作(C语言)

    零零总总搜索了一些关于链栈的资料,了解了链栈的基本操作,一直觉得别人写的代码或多或少存在一些问题,所以打算自己写一篇关于链栈的文章,也算是对所学知识的梳理和巩固了。 首先说明本文使用C语言进行链栈的基本操作,链栈是无头结点的。这里补充说明一下,

    2024年02月05日
    浏览(41)
  • 【数据结构】 链栈的基本操作 (C语言版)

    目录 一、链栈 1、链栈的定义: 2、链栈的优缺点: 二、链栈的基本操作算法(C语言)     1、宏定义   2、创建结构体 3、链栈的初始化   4、链栈的进栈 5、链栈的出栈 6、获取栈顶元素 7、栈的遍历输出 8、链栈的判空  9、求链栈的栈长 10、链栈的清空 11、链栈的销毁

    2024年01月24日
    浏览(38)
  • 【数据结构】栈——共享栈、链栈(入栈 出栈 判空 创建 读栈顶元素)完整代码

    只允许在一端进行插入操作或删除的线性表。 重要术语 栈顶:允许 插入和删除的一端。 栈底:不允许 插入删除的一端。 空栈:不含任何元素的空表。 出栈顺序(卡特兰数): n个不同元素进栈,出栈元素不同排列的个数: 1 n + 1 C 2 n n frac{1}{n+1} quad C_{2n}^n n + 1 1 ​ C 2 n n ​

    2024年02月11日
    浏览(27)
  • 探索树形数据结构,通识树、森林与二叉树的基础知识(专有名词),进一步利用顺序表和链表表示、遍历和线索树形结构

      结点之间有分支,具有层次关系 树的定义 : 树 (tree)是n(n≥0)个有限集。 若n = 0,则称为空树; 若n 0,则它满足如下两个条件: 有且仅有一个特定的称为根(Root)的结点; 其余结点可分为m(m≥0)个互不相交的有限集T1,T2,T3,.....,Tm,其中每一个集合本身又是一棵树,并称为根的

    2024年02月01日
    浏览(33)
  • 数据结构:线性表顺序存储结构———顺序表

    目录 顺序表的定义 初始化线性表 销毁线性表 求线性表的长度 判断是否为空表 插入数据元素 逻辑序号与物理序号的区别 删除数据元素 输出线性表  按序号求线性表中的元素 按元素值查找 整体上创建顺序表 顺序表实验 线性表的顺序存储是把线性表中的所有元素按照其逻辑

    2024年02月03日
    浏览(35)
  • 数据结构->顺序表实战指南,(手把手教会你拿捏数据结构顺序表)

    文章目录 ✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉 🍎个人主页:橘橙黄又青-CSDN博客 今天开始我们正式进入数据结构的学习了,这篇简单了解一下: 线性表的存储结构:顺序存储结构、链式存储结构; 顺序表的定义:用一段物理地址连

    2024年01月25日
    浏览(41)
  • 【数据结构】二叉树——顺序结构

    由于每个节点都 只有一个父节点 ,所以我们可通过双亲来表示一棵树。具体方式通过 数组的形式 实现。 根节点的下标为0 按照层序从上到下排序 每层从左向右递增 表示形式: 二维数组 数据的列标为0 ,只需确定行标,即可锁定位置 根节点的父节点下标为 -1 列标为1存父节

    2024年02月02日
    浏览(38)
  • 数据结构之表达式求值

     前言 运用堆栈解决表达式的求值,代码思路为: 1.定义两个栈,一个char类型的栈用于存放运算符(ysf)一个int类型的栈用于存放操作数(czs) 如一个表达式3+6*9,将“+”,“*”入ysf栈,将“3”“6”“9”入czs栈 2.运用getchar进行数据的录入,如果接收的是运算符,将其插入到运

    2024年04月29日
    浏览(26)
  • 数据结构(顺序结构、链式结构、索引结构、散列结构)

    数据结构,就是一种程序设计优化的方法论,研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算, 目的是加快程序的执行速度、减少内存占用的空间 。 数据的逻辑结构指反映数据元素之间的逻辑关系,而与数据的存储无关,是独立于计算

    2024年02月03日
    浏览(69)
  • 数据结构与算法——顺序表(顺序存储结构)及初始化详解

    顺序表 ,全名 顺序存储结构 ,是线性表的一种。通过《什么是线性表》一节的学习我们知道,线性表用于存储逻辑关系为“一对一”的数据,顺序表自然也不例外。 不仅如此,顺序表对数据的物理存储结构也有要求。 顺序表存储数据时,会提前申请一整块足够大小的物理

    2024年02月16日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包