首页 > 其他分享 >数据结构实验4

数据结构实验4

时间:2025-01-10 16:55:06浏览次数:1  
标签:return int expr top current 实验 数据结构 表达式

7-2 栈实现表达式求值
使用键盘输入数学表达式(含数字,四种运算符+、-、、/和小括号,其中运算数都是一位数(0~9)),将数学表达式转化成后缀表达式输出,利用后缀表达式求表达式的值并输出。

输入格式:
输入正确的表达式(可以有空格)后回车,得到后缀表达式和结果。输入括号缺失的表达式,输出"ERROR:缺少括号"。输入两个除括号外运算符连续的表达式,输出"ERROR:表达式缺操作数"。

输出格式:
请在这里描述输出格式。例如:对每一组输入,在一行中输出A+B的值。

输入样例:
在这里给出一组输入。例如:

5*(8-(3+2))
输出样例:
在这里给出相应的输出。例如:

5832+-*
15

代码:
`#include<stdio.h>

include<stdlib.h>

include<string.h>

include<ctype.h>

define MAX_SIZE 100

//运算符优先级
int precedence(char op){
if(op'+'||op'-')
return 1;
if(op'*'||op'/')
return 2;
return 0;
}

//判断是否为操作数
int isOperand(char ch){
return isdigit(ch);
}

//判断是否为运算符
int isOperator(char ch){
return (ch'+'||ch'-'||ch'*'||ch'/');
}

//判断括号是否匹配
int isValidExpression(char *expr){
int balance=0;
for(int i=0;expr[i]!='\0';i++){
if(expr[i]'(')
balance++;
if(expr[i]
')') //右括号多于左括号
balance--;
if(balance<0) //左右括号数量是否相等
return 0;
}
return(balance==0);
}

//转换为后缀表达式并计算值
void evaluate(char *expr){
char stack[MAX_SIZE];
int top=-1;
char postfix[MAX_SIZE];
int postIndex=0;

if(!isValidExpression(expr)){
    printf("ERROR:缺少括号\n");
    return;
}

//处理操作符和数
for(int i=0;expr[i]!='\0';i++){
    char current=expr[i];

    //跳过空格
    if(current==' ')
        continue;

    //如果时操作数,直接添加到后缀表达式
    if(isOperand(current)){
        int num=0;
        while(isdigit(expr[i])){
            num=num*10+(expr[i]-'0');
            i++;
        }
        postfix[postIndex++]=num;
        i--;
    }
    //如果是左括号,压入栈
    else if(current=='('){
        stack[++top]=current;
    }
    //如果是右括号,弹出之道遇到左括号
    else if(current==')'){
        while(top>=0&&stack[top]!='('){
            postfix[postIndex++]=stack[top--];
        }
        if(top<0){
            printf("ERROR:缺少括号\n");
            return ;
        }
        top--;
    }
    //如果是运算符
    else if(isOperator(current)){
        //弹出栈中优先级大于等于当前运算符的所有运算符
        while(top>=0&&precedence(stack[top])>=precedence(current)){
            postfix[postIndex++]=stack[top--];
        }
        stack[++top]=current;
    }else{
        printf("ERROR:无效字符\n");
        return ;
    }
}

//将栈中剩余的运算符添加到后缀表达式
while(top>=0){
    if(stack[top]=='('){
        printf("ERROR:缺少括号\n");
        return;
    }
    postfix[postIndex++]=stack[top--];
}
postfix[postIndex]='\0';   //后缀表达式结束
printf(":%s\n",postfix);

//计算后缀表达式的值
int result[MAX_SIZE];
int resultIndex=-1;

for(int i=0;postfix[i]!='\0';i++){
    char current=postfix[i];

    if(isOperand(current)){
        result[++resultIndex]=current-'0';
    }else if(isOperator(current)){
        if(resultIndex<1){
            printf("ERROR:表达式缺操作数\n");
            return;
        }
        int b=result[resultIndex--];
        int a=result[resultIndex--];
        switch(current){
            case '+':result[++resultIndex]=a+b;break;
            case '-':result[++resultIndex]=a-b;break;
            case '*':result[++resultIndex]=a*b;break;
            case '/':
                if(b==0){
                printf("ERROR:除数不能为0\n");
                return;
            }
            result[++resultIndex]=a/b;
                break;
        }
    }
}
if(resultIndex!=0){
    printf("ERROR:表达式缺操作数");
    return ;
}
printf("%d\n",result[resultIndex]);

}

int main(){
char expr[MAX_SIZE];

//输入数学表达式
if(fgets(expr,MAX_SIZE,stdin)==NULL){
    printf("ERROR:输入错误\n");
    return 1;
};

//去除输入末尾的换行符
expr[strcspn(expr,"\n")]='\0';

//处理表达式
evaluate(expr);
return 0;

}`

标签:return,int,expr,top,current,实验,数据结构,表达式
From: https://www.cnblogs.com/LiuHuWei/p/18664256

相关文章

  • 数据结构实验六
    石家庄铁道大学实验报告课程名称:数据结构与算法设计 任课教师:刘丹 实验日期:2024.12.15班级:信2305-3 姓名:徐戌 学号:20234316实验项目名称:实验六一、 实验目的1.掌握插入排......
  • 【西南科技大学计算机学院、智能计算与系统结构实验室主办 | ACM独立出版 | 往届均已
    ACM独立出版|往届均已成功检索,最快刊后1个月内实现EI检索征稿主题范围广:计算机网络安全、软件工程、信号处理、程序分析等领域主办单位:西南科技大学计算机学院、智能计算与系统结构实验室第五届计算机网络安全与软件工程国际学术会议(CNSSE2025)20255thInternational......
  • 数据结构(红黑树)
    问题的起源学习一个知识模块,一般先要厘清学习的目的,一个技术分支的出现必然是应对某个具体问题而产生的解决方案,搞清楚了问题的起源,对解决问题的思路就有了根本性的理解,来龙去脉把握清楚了学习起来就既有动力又有目标了。回归到红黑树的问题,红黑树其实也是一种平衡树,之前......
  • JSP开放实验室预约管理系统2118f--(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、研究背景与意义随着教育和科研的不断发展,实验室资源的有效管理和开放共享成为重要议题。传统的人工管理方式存在效率低、资源浪费等问题,无法满......
  • 数据结构全书简答题汇总(期末、考研)三万多字
    第一章:绪论-灰灰考研汇总1.数据:数据是信息的载体,是描述客观事物属性的数、字符以及所有能输入到计算机中并 被计算机程序处理的符号的集合。2.数据元素:数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。3.数据项:数据项是数据结构中讨论的最小单位。 是数据......
  • 从上千份大厂面经呕心沥血整理:大厂高频手撕面试题(数据结构和算法篇 ,C++实现亲试可跑)
    目录 怎么判断两个链表是否相交?怎么优化?(字节跳动、货拉拉)手撕冒泡排序(美团)手撕快速排序(作业帮)手撕堆排序(美团)手撕归并排序(美团)手撕二分查找(VIVO)字符串的全排列(要求去重)(字节跳动)求一个字符串中最长不重复子串的长度(字节跳动) 反转字符串的单词:如何在原字符串上翻转......
  • 数据结构真难
    在期末周算是被数据结构狠狠折磨了,当然自己在之前在数据结构方面的学习还存在着欠缺,自己往后得多加上心,总的来说呢,数据结构是一门具有一定难度的课程,在复习过程中难免会遇到各种困难和挫折,如复杂的算法理解、难以调试的代码等。但是,只要保持克服困难的毅力和决心,不断地尝试和探索,......
  • [数据结构学习笔记10] 哈希表(Hashtable)
    哈希表也叫Hashmap或者Dictionary,它存储和检索都非常快,所以常用于缓存数据供后续快速访问。哈希函数,是这样的一个函数,你提供一个input,它会返回一个唯一的值(hashcode)。只要你的input是相同的,这个哈希函数会返回同样的output。从哈希函数到哈希表哈希表底层是一个数组结构,这意味......
  • Report -「概率数据结构」随机化骗分?我们是专业的!
    \[\mathscr{Lorain~y~w~la~Lora~blea.}\newcommand{\DS}[0]{\displaystyle}%operatorsalias\newcommand{\opn}[1]{\operatorname{#1}}\newcommand{\card}[0]{\opn{card}}\newcommand{\lcm}[0]{\opn{lcm}}\newcommand{\char}[0]{\opn{char}}\newc......
  • AHU计组(5)数据表示实验
    【设计题目】      数据表示实验                    【设计目的】深入理解数据表示原理掌握海明编码的设计原理,理解其检错纠错性能掌握CRC校验码的基本原理,理解其检错、纠错性能熟悉流水同步传输机制,理解流水清空、暂停原理【设计内容】汉......