输入表达式 转后缀 计算 输出 看看有关问题出在哪里

输入表达式 转后缀 计算 输出 看看问题出在哪里
我是这样想的 先用一个string输入表达式 然后将里边的数字和运算符分离 顺序不做改变 用一个链表存起来//StrToList,再将这个链表改为后缀//StrToStr,最后运算//Calcu
编译通过 运行时StrToList无法返回值
C/C++ code

//func.h
#ifndef FUNC_H
#define FUNC_H
#include "list.h"
#include "Stack.h"
#include<string>
#include<iostream>
using namespace std;

List StrToList(string &);
List StrToStr(List &);
float Calcu(List &);

#endif


C/C++ code

//func.cpp
#include"func.h"
#include<cctype>

List StrToList(string &Mstr)
{
    string numing="";
    float num1=0;
    float num2=0;
    char ch='\0';
    Value data;
    List M;
    for(int i=0;i<=Mstr.length();i++)
    {
        numing="";
        num1=0;//小数点之前
        num2=0;//小数点之后
        if(Mstr.at(i)=='.')//遇到小数点
        {
            i++;
            while(isdigit(Mstr.at(i)))
            {
                numing+=Mstr.at(i);
                i++;
            }
            i--;
            num2=atoi(&numing.at(0));
            for(int j=0;j<=numing.length();j++)
                num2=num2/10;
            M.Getlast()->Data.num=M.Getlast()->Data.num+num2;//chang list's last
        }
        else
        {
            if(isdigit(Mstr.at(i)))
            {
                while(isdigit(Mstr.at(i)))
                {
                    numing+=Mstr.at(i);
                    i++;
                }
                i--;

                num1=atoi(&numing.at(0));
                data.num=num1;
                M.Insert(data,Float)//insert list
            }
            else
            {
                data.ch=Mstr.at(i);
                M.Insert(data,Char);//insert list
            }
        }
    }
    return M;
}


List StrToStr(List &M)
{
    List B;
    Stack temp;
    Value data;

    data.ch='#';
    temp.Push(data,Char);
    M.Insert(data,Char);
    Node *p=M.Getfirst();
    while(p!=0)
    {
        if(p->Type==Float)////////////操作数 输出
        {
            B.Insert(p->Data,Float);
            p=p->link;
        }
        else
        {
            if(temp.Gettop()->isp()==p->icp())
            {
                    temp.Pop();
                    p=p->link;
            }
            if(temp.Gettop()->isp()<p->icp())///////////////isp<icp 入栈
            {
                temp.Push(p->Data,Char);
                p=p->link;
            }
            if(temp.Gettop()->isp()>p->icp())
            {
                while(temp.Gettop()->isp()>p->icp())
                {
                    B.Insert(temp.Pop(),Char);
                    p=p->link;
                }
            }

        }
    }
    return B;
}


float Calcu(List &B)
{
    Value data;
    Stack temp;
    Node *p=B.Getfirst();
    while(p!=0)
    {
        if(p->Type==Float)
            temp.Push(p->Data,Float);
        else
        {
            data=temp.Pop();
            if(p->Data.ch='+')
                data.num=data.num+temp.Pop().num;
            if(p->Data.ch='-')
                data.num=data.num-temp.Pop().num;
            if(p->Data.ch='*')
                data.num=data.num*temp.Pop().num;
            if(p->Data.ch='/');
                data.num=data.num/temp.Pop().num;
            temp.Push(data,Float);
        }
        p=p->link;
    }
    return temp.Pop().num;
}


C/C++ code

#include"func.h"
#include<iostream>
using namespace std;


void main()
{
    string Mstr;
    cin>>Mstr;

    cout<<Calcu(StrToStr(StrToList(Mstr)));

    int i;
    cin>>i;


}


list和stack用的节点是自己做的
C/C++ code