中缀表达式的计算C++(C语言可参考)

//中缀表达式的计算 
//将输入的算术表达式存储到字符串 S 中;
//建立并初始化操作数栈和运算符栈,并将‘#’压入运算符栈;
//建立二维数组存储算术运算符的优先关系;
//建立并初始化一个临时栈T用来处理多位数或小数;
// 依次(循环)读.. ch 是操作数,将其入临时栈;
/*当读入的字符 ch 是运算符:
将临时栈中的数据转化为整数或小数(这需要编写个函数),
并将转化后的数据入操作数栈,清空临时栈;
// 根据运算符栈的栈顶元素和 ch 的优先权比较结果,做不同的处理:
a)若是小于,则 ch 压入运算符栈,读入下一个字符;
//b)若是大于,则弹出运算符栈顶的运算符,从操作数栈弹出两个数,进行相
//应运算,将结果压入操作数栈;
c)若是等于,则运算符栈顶元素是‘(’且 ch 是‘)’,这时弹出运算符栈顶的
‘(’,相当于去括号,然后读入下一个字符;
d)当读入的字符 ch 是‘#’,且运算符栈顶元素也是‘#’时,
算法结束。*/


输入示例:

/*
2+3+5*6-(8+2)-6/2
>><<<>
>><<<>
>>>><>
>>>><>
<<<<<=
*/

//下面代码中注释部分是写作是验证用的,读者可以直接删除或者忽视,在代码中不起任何作用!


#include
using namespace std;
#define MAXSIZE 20
#define N 10
//运算符栈 
typedef struct 
{
    char *base;
    char *top;
    int size;
 }stack1;
//操作数栈
typedef struct
{
    int *base;
    int *top;
    int size;
 }stack2;
//为什么没有必要建一个临时栈
//运算符栈的初始化 
void init1(stack1 &S)
{
    S.base=new char[MAXSIZE];
    S.top=S.base;
    S.size=MAXSIZE;
//    *S.top++='#';//讨论*S.top++=和S.top++ 
}
//操作数栈的初始化 
void init2(stack2 &S)
{
    S.base=new int[MAXSIZE];
    S.top=S.base;
    S.size=MAXSIZE;
 } 
//运算符入栈 
void push1(stack1 &S,char e)
{
    if(S.top-S.base==S.size)
        exit(0);
    *S.top++=e;
 }
//操作数入栈 
void push2(stack2 &S,char e)
{
    if(S.top-S.base==S.size)
        exit(0);
    *S.top++=e-48;
 } 
//运算符出栈
void pop1(stack1 &S,char &e)
{
    if(S.base==S.top)
        exit(0);
    e=*--S.top;
 } 
//操作数出栈
void pop2(stack2 &S,int &e)
{
    if(S.base==S.top)
        exit(0);
    e=*--S.top;
 } 
int verify(char ch)
{
    //cout<')//栈顶>ch  
            {
        //        cout<<"sssssss"<='0'&&S[i]<='9')//是数字
        {
            push2(S2,S[i]);//入操作数栈 
    //        cout<<"22222222"<ch,弹出top,弹出两个操作数,进行计算,结果压入操作数栈;
            //如果=,弹出栈顶 
            //cout<

 

运行说明:

输入的时候,先输入一个式子,

然后,输入下面的符号(直接复制粘贴即可):

 >><<<>
>><<<>
>>>><>
>>>><>
<<<<<=

输入这些玩意的主要原因呢是因为——代码中考虑运算符优先级的时候,将不同运算符之间的优先级关系存在了一个二维数组里!

咱们输入的这堆东西,就是二维数组存储的内容!

你可能感兴趣的:(数据结构(C语言第二版),c++,算法,开发语言)