数据结构(C语言版)用顺序栈计算表达式

【实验内容与要求】
问题描述:利用栈的基本操作实现一个算术表达式的求值的程序。
基本要求:
(1) 定义栈的顺序存取结构。
(2) 分别定义顺序栈的基本操作(初始化栈、判栈空否、入栈、出栈等)。
(3) 定义一个函数用来计算表达式结果,并且可以显示表达式的后缀表示。
(4) 设计一个测试主函数进行测试。

数据结构的形式~~符合的话追加分数~~

#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<stdlib.h>

typedef struct
{
char fun;
int grade;
}Functor;
//定义算符栈结构体
Functor FUNCTOR[20];
float NUM[20];
//定义算符栈和对象栈
char ch[100];
int sub=0;
//存放输入流的字符串

float Char_To_Num(){
//将表示数据的字符串转化成数据
int flag=0, i=-1;
float value=0.0;
while((ch[sub]>=48 && ch[sub]<=57) || ch[sub]=='.'){
if(ch[sub]=='.')
flag=1;
else{
if(flag==0) value=value*10+ch[sub]-48;
else{
value=value+( ch[sub]-48 )*pow(10,i);
i--;
}}
sub++;
}
return value;
}

int In_Grade(char c)
{ //算符在栈内时的级别
int g;
switch(c)
{
case '^': g=3;break;
case '*':
case '/':
case '%': g=2;break;
case '+':
case '-': g=1;break;
case '(': g=0;break;
case ')': g=-1;break;
}
return g;
}

int Out_Grade()
{ //算符在栈外时的级别
int g;
switch(ch[sub])
{
case '^': g=4;break;
case '*':
case '/':
case '%': g=2;break;
case '+':
case '-': g=1;break;
case '(': g=4;break;
case ')': g=-1;break;
}
return g;
}

void Error()
{
printf("输入的表达式有误!\n");
printf("\n按任意键退出");
getch();
exit(1);
}

void Calculate(int i, int j)
{
if(i>=2)
{ //判断对象栈中元素个数
switch(FUNCTOR[j-1].fun)
{
case '^': NUM[i-2]=pow(NUM[i-2],NUM[i-1]); break;
case '*': NUM[i-2]=NUM[i-2]*NUM[i-1]; break;
case '/': NUM[i-2]=NUM[i-2]/NUM[i-1]; break;
case '%': NUM[i-2]=int(NUM[i-2])%int(NUM[i-1]); break;
case '+': NUM[i-2]=NUM[i-2]+NUM[i-1]; break;
case '-': NUM[i-2]=NUM[i-2]-NUM[i-1]; break;
}
NUM[i-1]=0;
FUNCTOR[j-1].fun=0;
}
else Error();
//若对象栈若只剩一个数据,则输入的表达式有误
}

float Char_Transform(){
int i=0, j=0, grade, flag=0;
while( ch[sub]!='=' || j!=0 ){
if(ch[sub]=='='){
//输入的字符是否取完
Calculate(i, j);
i--;
j--;}
else{
if(ch[sub]>=48 && ch[sub]<=57){
//判断是否为运算对象
NUM[i++]=Char_To_Num();
if(flag){
NUM[i-1]=-NUM[i-1];
FUNCTOR[j-1].fun=0;
j--;
flag=0;
}}
else{
if(ch[sub]=='%' ||
(ch[sub]>=40 && ch[sub]<=43) ||
ch[sub]=='-' ||ch[sub]=='^' ||
ch[sub]=='/'){
//判断是否为算符
if( FUNCTOR[j-1].fun=='-' &&
FUNCTOR[j-2].fun=='(' &&
ch[sub]==')'){
//判断是否为负数
NUM[i-1]=-NUM[i-1];
FUNCTOR[j-1].fun=0;
FUNCTOR[j-2].fun=0;
j=j-2;
sub++;}
else{
if( FUNCTOR[j-1].fun== '(' && ch[sub]== ')' ){
//括号内表达式计算完后则将左括号从栈中去除
FUNCTOR[j-1].fun=0;
j--;
sub++;}
else{
grade=Out_Grade(); //栈外算符的级别
if(j==0 || grade>FUNCTOR[j-1].grade){
//第一个或级别比栈内算符高的进栈
FUNCTOR[j].fun=ch[sub];
FUNCTOR[j].grade=In_Grade(ch[sub]);
if(j==0 && FUNCTOR[j].fun=='-') flag=1;
j++;
sub++;}
else{
Calculate(i, j);
i--;
j--;
}}}}
else Error();
//表达式中有非算术字符,则表达式有误
}}}
return NUM[i-1];
}

void main()
{
float result;
printf("****************************************\n");
printf("请输入要求解的表达式,并以等号“=”结束:\n");
printf("****************************************\n");
gets(ch);
result=Char_Transform();
printf("%s%.2f\n", ch, result);
printf("\n按任意键退出");
getch();
}
温馨提示:内容为网友见解,仅供参考
无其他回答

数据结构:利用栈来实现算术表达式求值的算法。
int stacksize;};\/\/顺序栈结构模板 template <typename T1,typename T2> Status InitStack(T1 &S){ S.base=(T2 *)malloc(STACK_INIT_SIZE*sizeof(T2));if(!S.base) exit (overflow);S.top=S.base;S.stacksize=STACK_INIT_SIZE;return ok;}\/\/初始化栈函数模板 template <typename T1,...

(二)用顺序栈实现算术后缀表达式求值
1、算法思想后缀表达式求值步骤:a、循环读出后缀表达式中的每一个字符;b、若是数字,将对应的字符串转换成整数,入栈;c、若是运算符,从栈中弹出2个数,将运算结果再压入栈;d、若... 1、算法思想后缀表达式求值步骤:a、循环读出后缀表达式中的每一个字符;b、若是数字,将对应的字符串转换成整数,入栈;c、若是...

哪位大神帮我看看这个C语言的题 那个 “栈”是什么意思啊
所以出栈顺序应为:D,C,B,A,1,2,3,4,5

C语言数据结构:利用两个顺序栈来实现一个列队的功能时遇到的问题_百度...
s1已满,从栈顶到栈低依次是:5、4、3 s2非空,从栈顶到栈底依次是:1、2 此时要想在入栈一个元素6的话,按照你的想法,得把s1的数据出栈到一个缓冲区,然后把缓冲区中,在原来s1栈底的3挪动到s2的栈顶,然后s1的4、5依次压回栈s1,然后s1就能够空出栈顶的一个位置了,对吧?但是,这...

数据结构中计算栈的长度的函数看不懂
是顺序栈吧?你这个栈的结构体定义应该贴出来。s[0 ]s[1 ]s[2 ]s[3 ]比如p首先指向是s[0],p=s.top。然后p开始往下挪动,一直到p等于s.base为止。p++不是往上的,是往下的...比如在数组里&a[0]=p;p++;之后p就指向a[1]了。栈顶在上,栈底在下,s.base应该相当于我的s[3]位...

数据结构栈存储题目求解!
(1)可能的出栈顺序是 123(即1进栈就出栈,然后2进2出,再3进3出)132(即1进1出,2进3进,3出2出)213(即1进2进,2出1出,3进3出)231(即1进2进,2出3进,3出1出)321(即1进2进3进,3出2出1出)(2)不能得到435612出栈顺序,因为按照进站的车厢序列为123456的话,进出...

关于数据结构(C语言)的几个题
第二部:72比48大,low指向mid+1,重新算出mid,指向72,再与72比较,即查找成功。最多比较次数参考严蔚敏《数据结构》第九章 查找 220页。5.例如图中这棵树,假设i=2,2i=4不大于n,2i+1=5大于n,所以2这个结点没有右子树。6.顺序栈的类型定义:typedef struct{ char *base; \/\/也...

设有两个堆栈S1,S2都采用顺序栈方式,并且共享一个存储区,采用栈顶相...
1 s1空:S1的栈顶等于栈底 s2空:s2的栈顶等于栈底 2 s1满:S1的栈顶等于S2的栈顶 s2满:S2的栈顶等于S1的栈顶 include<stdio.h> define TYPE_S1 1 define TYPE_S2 -1 define STACK_SIZE 20 void StackPush(int **stackTop, int elmnt, int type){ stackTop = elmnt;stackTop += ...

数据结构分析?
栈是后入先出的数据结构,新入栈的元素x为新栈顶 因此top应先加1,指向新栈顶的下标,然后储存x的值,即data[top]=x 而++top表示先对top加1再返回top值,top++则表示先返回top值再对top加1 所以结合起来应为:data[++top]=x,选D

栈——顺序栈
具体操作包括初始化、入栈、出栈、判断是否为空、查找栈顶元素、判断是否已满以及销毁。对于十进制转二进制以及后缀表达式计算,顺序栈也提供了相应操作。代码分为seqstack.h文件和seqstack.c文件,实现了所需功能。顺序栈优势在于结构简单、操作便捷,但也有固定容量的限制。为了减少扩容操作带来的不便,初始...

相似回答