C语言 任意表达式求值。(栈的应用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言 任意表达式求值。(栈的应用相关的知识,希望对你有一定的参考价值。

一、 实习指导思想和目的任务:
通过数据结构的实习,使学生掌握数据结构与算法的设计方法,具备初步的算法设计和分析能力 ;初步掌握软件开发过程的问题分析、系统分析、程序编码、调试测试等基本方法和基本技能;提高综合运用所学理论知识和方法,独立分析和解决问题的能力。
二、 实习内容:
1. 任意表达式求值。(栈的应用)
2. 走迷宫。(栈的应用)
3. 小型文本编辑器。(串的应用)
4. 教学计划编制问题。(拓扑排序)
5. 自选设计题目。
三、 实习组织安排和实习方法
本课程设计共一周时间,第一阶段(一天)指导老师讲解实习内容及要求需2学时,然后学生确定自己的选题,第二阶段,进行详细设计和程序编码(2-3天),第三阶段,程序调试与测试并完善程序的功能(1-2天),第四阶段,撰写课程设计说明书,上交源代码(最后半天)。整个过程每人一机在老师指导下完成。
四、 实习成绩考核办法
设计成绩分三部分:设计报告占20%,作品成绩占70%,考勤及平时表现占10%,根据学生完成作品的优劣及设计说明书的质量等综合评定,分为优、良、中、及格、不及格五个等级。
五、 实习具体要求
1. 要求用C语言或VC++来描述算法,在Turbo C2.0或VC++6.0环境下调试运行程序。
2. 完成系统总体设计、各功能模块设计。
3. 遵守机房的一切规章制度、独立完成,禁止从网上下载现成程序。
六、 设计说明书要求
1. 包括目录、设计思路、源代码、调试分析、使用说明、心得体会和参考文献。
2. 设计思路细分为:
(1) 需求分析
以无歧义的陈述说明程序设计的任务,强调的是程序要做什么?同时明确规定:输入的形式和输出值的范围;输出的形式;、程序所能够达到的功能;测试数据:包括正确的输入及其输出结果和含有错误的输入及其输出结果。
(2)详细设计
说明本程序中所有用到的数据及其数据结构的定义,包含基本操作及其伪码算法;画出函数之间的调用关系图;写出主程序及其主要模块的伪码流程。
3.源程序代码
4.调试分析
调试过程中遇到的问题是如何解决的以及对设计与实现的回顾和分析;列出你的测试结果,包括输入和输出,注意测试数据应该完整和严格,至少给出四组测试结果;算法的时空分析和改进思想。
5.用户使用说明 说明你编写的程序的使用方法,详细列出每一步的操作步骤。
6.经验和体会等。
7.参考文献 。
急用啊 帮我

/*** 只适合整数的表达式求值 ***/
/***其中部分可作修改,表达式也可是输入的***/
#include "iostream.h"
const int n0=30;
int s1[n0+1]; //操作数栈
char s2[n0+1]; //运算符栈
int t1,t2;
int num[4]; //提取表达式中的整数

void calcu() //一次计算

int x1,x2,x;
char p;
//弹出一个运算符
p=s2[t2--];
//弹出两个操作数
x2=s1[t1--];
x1=s1[t1--];
//进行一次运算
switch(p)
case '+':x=x1+x2;break;
case '-':x=x1-x2;break;
case '*':x=x1*x2;break;
case '/':x=x1/x2;

//结果压入操作数栈
s1[++t1]=x;


int calculator(char *f)

int v,i=0;
char *p=f;
t1=t2=0; //设置空栈
while (*p!='\0')
switch(*p)
case '+': case '-':
while (t2&&(s2[t2]!='('))
//执行先遇到的加、减、乘、除运算
calcu();
//当前运算符进栈
s2[++t2]=*p;
//读下一个字符
p++;
break;
case '*': case '/':
if (t2&&(s2[t2]=='*')||(s2[t2]=='/'))
//执行先遇到的乘、除运算
calcu();
//当前运算符进栈
s2[++t2]=*p;
//读下一个字符
p++;
break;
case '(':
//左括号进栈
s2[++t2]=*p;
//读下一个字符
p++;
break;
case ')':
while (s2[t2]!='(')
//执行括号内的加、减、乘、除运算
calcu();
//弹出左括号
t2--;
//读下一个字符
p++;
break;
default:
//把字符串转换成整数值
v=0;
do
v=10*v+*p-'0';
p++;
while((*p>='0')&&(*p<='9'));
//操作数进栈
s1[++t1]=v;
num[i++]=v;
;
//执行先遇到的加、减、乘、除运算
while (t2) calcu();
//返回结果
return s1[t1];


void main()

char a[]="5*(40+6)-39";
cout<<calculator(a)<<endl;
cout<<"其中的数字为:\n";
for (int i=0;i<4;i++)

cout<<num[i]<<' ';

cout<<endl;

原来做过的东西,是C++的,VC++6.0环境下调试运行成功。
参考技术A /***
只适合整数的表达式求值
***/
/***其中部分可作修改,表达式也可是输入的***/
#include
"iostream.h"
const
int
n0=30;
int
s1[n0+1];
//操作数栈
char
s2[n0+1];
//运算符栈
int
t1,t2;
int
num[4];
//提取表达式中的整数
void
calcu()
//一次计算

int
x1,x2,x;
char
p;
//弹出一个运算符
p=s2[t2--];
//弹出两个操作数
x2=s1[t1--];
x1=s1[t1--];
//进行一次运算
switch(p)

case
'+':x=x1+x2;break;
case
'-':x=x1-x2;break;
case
'*':x=x1*x2;break;
case
'/':x=x1/x2;

//结果压入操作数栈
s1[++t1]=x;

int
calculator(char
*f)

int
v,i=0;
char
*p=f;
t1=t2=0;
//设置空栈
while
(*p!='\0')
switch(*p)

case
'+':
case
'-':
while
(t2&&(s2[t2]!='('))
//执行先遇到的加、减、乘、除运算
calcu();
//当前运算符进栈
s2[++t2]=*p;
//读下一个字符
p++;
break;
case
'*':
case
'/':
if
(t2&&(s2[t2]=='*')||(s2[t2]=='/'))
//执行先遇到的乘、除运算
calcu();
//当前运算符进栈
s2[++t2]=*p;
//读下一个字符
p++;
break;
case
'(':
//左括号进栈
s2[++t2]=*p;
//读下一个字符
p++;
break;
case
')':
while
(s2[t2]!='(')
//执行括号内的加、减、乘、除运算
calcu();
//弹出左括号
t2--;
//读下一个字符
p++;
break;
default:
//把字符串转换成整数值
v=0;
do

v=10*v+*p-'0';
p++;

while((*p>='0')&&(*p<='9'));
//操作数进栈
s1[++t1]=v;
num[i++]=v;
;
//执行先遇到的加、减、乘、除运算
while
(t2)
calcu();
//返回结果
return
s1[t1];

void
main()

char
a[]="5*(40+6)-39";
cout<<calculator(a)<<endl;
cout<<"其中的数字为:\n";
for
(int
i=0;i<4;i++)

cout<<num[i]<<'
';

cout<<endl;

原来做过的东西,是C++的,VC++6.0环境下调试运行成功。

23栈的应用-根据后缀表达式求值

main.c

#define _CRT_SECURE_NO_WARNING

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"Stack.h"

//判断是不是数字
int IsNumber1(char c) {
    return c >= 0 && c <= 9;
}

typedef struct MYNUM {
    StackNode node;
    int val;
}MyNum;


int Caculate(int left,int right,char c) {
    
    int ret = 0;
    switch (c) {
    case+:
        ret = left + right;
        break;
    case-:
        ret = left - right;
        break;
    case*:
        ret = left*right;
        break;
    case/:
        ret = left / right;
        break;
    default:
        break;
    }
    return ret;
}


int main()
{
    char* str = "831-5*+";
    char* p = str;

    LinkStack* stack = InitStack();

    while (*p!=) {
        if (IsNumber1(*p)) {
            MyNum* num = (MyNum*)malloc(sizeof(MyNum));
            num->val = *p - 0;

            Push(stack, num);

        }
        else {

            //先从栈中弹出右操作数
            MyNum* right = (MyNum*)GetTop(stack);
            int rightNum = right->val;
            Pop(stack);
            free(right);
            //取出左操作数
            MyNum* left = (MyNum*)GetTop(stack);
            int leftNum = left->val;
            Pop(stack);
            free(left);

            int ret = Caculate(leftNum, rightNum, *p);
            //结果入栈
            MyNum* num = (MyNum*)malloc(sizeof(MyNum));
            num->val = ret;
            Push(stack,num);
        }
        p++;
    }

    if (StackLength(stack) == 1) {
        MyNum* num = (MyNum*)GetTop(stack);
        printf("运算结果是:%d
",num->val);
        Pop(stack);
        free(num);
    }

    //释放栈
    DestoryStack(stack);

    printf("
");
    system("pause");
    return 0;
}

 

以上是关于C语言 任意表达式求值。(栈的应用的主要内容,如果未能解决你的问题,请参考以下文章

栈的应用——表达式求值

C语言关于表达式求值

23栈的应用-根据后缀表达式求值

数据结构 栈的应用——算术表达式求值

C语言编一个实现简单的算术表达式求值的代码。

栈的应用:表达式求值运算