之前写过这个的博客,但是觉得不太好,都是截屏,所以我就趁有时间整理了一下。(结果发现了一个天大的低级错误。)
我在实现栈的时候把析构函数写错了()所以就出现了以下的错误:
首先,运行的时候答案是对的,但是是内存错误表现:
然后我就进行单步调试:
一直执行到最后一句代码也没有错误,直到最后一个大括号就出现了......
所以说明可能是出现了内存泄露。
果然,析构函数我写成了:
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
调整一下,把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;
}