后缀表达式/中缀到后缀表达式

输入空格跳出循环

 while((k=getchar())!='\n')
    {
        a[i]=k;
        i++;
    }

后缀表达式(此代码仅限于0~9内的加减乘除)

#include <iostream>
#include <stdlib.h>
#include <stdbool.h>
#define long 10
using namespace std;
typedef  struct stack
{
    int* base;
    int  top;
    int size;
}qstack;
void init(qstack &s,int size)
{
    s.base=(int*)malloc(size*sizeof(int));
    s.top=0;
    s.size=size;
}
void push(qstack &s,int num)
{
    int*new_;
    if(s.top==s.size)
    {
        new_=(int*)realloc(s.base,(long+s.size)*sizeof(int));
        s.size=s.size+long;
    }
    s.base[s.top]=num;
    s.top++;
}
int pop(qstack &s)
{
    int e;
    s.top--;
    e=s.base[s.top];
    return e;
}
int judge(char a[],qstack &s,int e)//判断
{
    int sum;
    int lin=0,lin_=0;
    int i=0;
    for(i=0;i<e;i++)
    {
        if(a[i]==43||a[i]==45||a[i]==47||a[i]==42)//先判断是不是运算符号
        {
            lin=pop(s);//栈顶出栈
            lin_=pop(s);//出栈
            if(a[i]=='*')//应该先判断乘除在判断加减
                lin=lin*lin_;
            else if(a[i]=='/')
                lin=lin/lin_;
            else if(a[i]=='+')
                lin=lin+lin_;
            else if(a[i]=='-')
                lin=lin-lin_;
            push(s,lin);//得到的新数字入栈
      }
        else if((a[i]>=40)&&(a[i]<=57))//判断是否式数字
        {
            sum=a[i]-'0';//将acsll转换成数字
            push(s,sum);
        }
    }
    return lin;
}
int main()
{
    qstack s;
    char k;
    int i=0,j;
    char a[100];
    init(s,100);
    while((k=getchar())!='\n')
    {
        a[i]=k;
        i++;
    }

    j=judge(a,s,i);
    cout<<j;
    push(s,1);
    return 0;
}


中缀到后缀

注意注意当不用指针的时候qlist不要忘记&

例子1+2*3+(4*5+6)*7

符号规则:+-  如果是空栈,则入栈,如果不是空栈,栈里元素(+-/*)出栈到清空,或者清空到遇见(的时候,+入栈

                 */   如果是空栈,则入栈,如果栈顶是+-,则入栈,如果是/*,则栈顶出栈,*入栈

                 ()    (入栈,当遇到)的时候,把(前面的元素出栈到数组中,(出栈

#include <iostream>
#include <stdlib.h>
#include <stdbool.h>
using namespace std;
typedef struct stack//栈的基本操作
{
    char *base;
    int top;
    int lenghsize;
}qstack;
void init(qstack &s,int size)
{
    s.base=(char*)malloc(size*sizeof(char));
    s.top=0;
    s.lenghsize=size;
}
void push(qstack &s,char c)
{
    s.base[s.top]=c;
    s.top++;
}
bool empty(qstack &s)
{
    if(s.top==0)
    {
        return true;
    }
    else
        return false;
}
char pop(qstack &s)
{
    char e;
    if(empty(s))
    {
     cout<<"error";
    }
    s.top--;
    e=s.base[s.top];
    return e;
    
}
char gettop(qstack &s)
{
    char e;
    e=s.base[s.top-1];
    return e;
}
void  convert(char a[],int e)//中缀转化到后缀
{
    char temp[100];//存储后缀的字符串
    int i,j=0;
    char k;//栈顶字符的返回
    qstack s;
    init(s,100);
    for(i=0;i<e;i++)
    {
        if(a[i]>='0' && a[i]<='9')//如果是数字的话
        {
            temp[j]=a[i];//存入数组
            j++;
        }
        else if(a[i]=='(')//如果是(
        {
            push(s,a[i]);//入栈
        }
        else if(a[i]==')')//如果是)
        {
            while(empty(s)== false)//从栈顶一直出栈到(,(前面的字符进入数组
            {
                if(gettop(s)=='(')
                {
                    pop(s);
                    break;//当出栈到(的时候break;
                }
                else
                {
                    temp[j]=gettop(s);
                    j++;
                    pop(s);
                }
            }
        }
        else if(a[i]=='+' || a[i]=='-')//如果是+-
        {
            while(empty(s)==false)
            {
                k=gettop(s);
                if(k=='+' || k=='-' || k=='*' || k=='/')//一直出栈,除非遇到(
                {
                    temp[j]=pop(s);
                    j++;
                }
                else
                    break;
            }
            push(s,a[i]);//把a[i]入栈
        }
        else if(a[i]=='*' || a[i]=='/')//如果是*/
        {
            k=gettop(s);
            while(empty(s)==false)
            {
                if(k=='*' || k=='/')//如果栈顶是*/
                {
                    temp[j]=gettop(s);//栈顶出栈
                    j++;
                    pop(s);
                }
                else
                    break;
            }
            push(s,a[i]);//a[i]入栈
        }
    }
    while(empty(s)==false)//到最后如果a数组都已经遍历完成但是栈还没有空,就把栈的元素出栈
    {
        temp[j]=gettop(s);
        j++;
        pop(s);
    }
    for(i=0;i<j;i++)
    {
        cout<<temp[i];
    }
}
int main()
{
    int i=0;
    char a[100];
    char c;
    while((c=getchar())!='\n')
    {
        a[i]=c;
        i++;
    }
    convert(a,i);
    return 0;
    
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值