栈实现表达式的计算

来源:互联网 发布:win7网络连接感叹号 编辑:程序博客网 时间:2024/05/16 07:28

之前写过这个的博客,但是觉得不太好,都是截屏,所以我就趁有时间整理了一下。(结果发现了一个天大的低级错误。)

我在实现栈的时候把析构函数写错了(委屈)所以就出现了以下的错误:

首先,运行的时候答案是对的,但是是内存错误表现:



然后我就进行单步调试:

一直执行到最后一句代码也没有错误,直到最后一个大括号就出现了......


所以说明可能是出现了内存泄露。

果然,析构函数我写成了:


。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

调整一下,把delete []base放在最后就好啦。

以下是我完整的代码:

#include<assert.h>#include<iostream>using namespace std;template<class Type>class Stack{private:        enum{STACK_DEFAULT_SIZE = 20};        Type *base;        size_t capacity;        size_t top;public:        Stack(size_t sz = STACK_DEFAULT_SIZE)        {                    capacity = sz > STACK_DEFAULT_SIZE? sz :STACK_DEFAULT_SIZE;            base = new Type[capacity] ;            top = 0;        }        ~Stack()        {              base = NULL;           capacity = top = 0;           delete []base;        }public:        bool isfull()const        {return top >= capacity?true:false;}        bool isempty()const        {return top == 0?true:false;}public:        void push( Type x)        {               if(!isfull())               {                  base[top++] = x;                  //top++;               }        }        void pop()        {           if(!isempty())                  {               top--;           }        }        Type gettop()        {            if(!isempty())            {                 return base[top-1];            }        }        void clear_stack()        {top = 0;}        size_t lenth()const        {return top;}        void show_stack()const        {          int i;          for(i = top-1;i>= 0;i--)          {             cout<<base[i]<<" | ";          }          cout<<endl;        }};int isp(char f){   switch(f)   {     case'@':     case'#':return 0;break;     case'(':return 1;break;     case'*':     case'/':     case'%':return 5;break;     case'+':     case'-':return 3;break;     case')':return 6;break;   }}bool isdigit(char f){   switch(f)   {   case'(':   case'*':   case'/':   case'%':   case'+':   case'-':   case'@':   case'#':   case')':return false;break;   default:return true;break;   }}int icp(char f){    switch(f)    {     case'@':     case'#':return 0;break;     case'(':return 6;break;     case'*':     case'/':     case'%':return 4;break;     case'+':     case'-':return 2;break;     case')':return 1;break;    }}float oper(float left,char op,float right){   float end;   switch(op)   {      case'+':end = left + right;break;      case'-':end = left - right;break;      case'*':end = left * right;break;      case'/':end = left / right;break;   }   return end;}void Change(Stack<char> ex,char *get){    char *p = get;    char ch = '#';    char ch1 = '@';    Stack<char> temp;    temp.push(ch);    temp.push(ch1);    while(!ex.isempty()&&temp.gettop()!='#')    {       if(isdigit(ex.gettop()))       {         *p =  ex.gettop();         p++;         ex.pop();       }       else       {           if(isp(temp.gettop())<icp(ex.gettop()))           {            temp.push(ex.gettop());            ex.pop();           }           else if(isp(temp.gettop())>icp(ex.gettop()))           {             *p = temp.gettop();             temp.pop();             ++p;           }           else if(isp(temp.gettop()) == icp(ex.gettop()))           {             temp.pop();             ex.pop();           }        }    }*p = '\0';temp.pop();}

#include"solvepoly.h"int main(){   Stack<char> old;   Stack<char> opnow;   Stack<float> finall;   char zhong[20] = "1+2+3+4+5+6+7";   char *p = zhong;   char hou[20];   char *h;   int count = 0;   float left;   float right;   float end;   int count1 = 0;   for(;*p!='\0';++p)   {     ++count;   }//有十三个   --count;//最后一个下标为12   old.push('#');   for(;count>=0;--count)   {     old.push(zhong[count]);   }   Change(old,hou);   h = hou;  for(;*h!='\0';++h)   {     ++count1;   }   --count1;//count1 = 10   for(;count1>=0;--count1)   {       opnow.push(hou[count1]);   }   while(!opnow.isempty())   {      if(isdigit(opnow.gettop()))      {       finall.push((float)(opnow.gettop()-'0'));    opnow.pop();      }      else      {       right = finall.gettop();    finall.pop();        left = finall.gettop();        finall.pop();        end = oper(left,opnow.gettop(),right);        finall.push(end);        opnow.pop();      }   }   cout<<finall.gettop()<<endl;   finall.pop();   return 0;}



0 0