| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 572 人关注过本帖
标题:只有kai斑竹能帮我了
只看楼主 加入收藏
想你的天空
Rank: 2
等 级:新手上路
威 望:5
帖 子:610
专家分:0
注 册:2004-12-30
收藏
 问题点数:0 回复次数:5 
只有kai斑竹能帮我了

这个问题弄了很久不出来, 问了很多人, 不是不懂就是没回音,或者忙.

首先: 程序在DEV里通过没问题。
问题出在: VS.NET2003里, 以不调试的方式运行, 结果对,但是运行结束后弹出以个错误信息,是什么内存溢出。 以调试的方式根本不能正确运行。

想了N久,反反复复看了代码, 就是不知道哪里错, 跪求了。


// DEV 05.10.22
#include "iostream"
#include"string"
using namespace std;

template<class T>
class Stack
{
public:
Stack(int maxSize);
~Stack(){ delete [] base ;}
//创建一个空的堆栈
bool isEmpty();
//若堆栈为空,则返回true,否则返回false
bool isFull();
//若堆栈为满,则返回true,否则返回false
int Length();
//precondition:Stack exist
//后条件:reture the length of Stack
Stack<T> *push(T x);
//add element
//getTop();
//precondition:Stack exist
//end :
Stack<T> *pop(T& x);
//precondition:Stack exist
//return the top element and delete it
T getTop();
private:
T *base ;
int top ; //top指向栈顶元素
int maxSize ;//指定元素最大个数
};


template<class T>
Stack<T>::Stack(int maxSize)
{
this->maxSize = maxSize ;
base = new T[maxSize] ;
top = -1;
}

template<class T>
bool Stack<T>::isEmpty()
{
return top == -1;
}
template<class T>
bool Stack<T>::isFull()
{
return top == maxSize-1 ;

}
template<class T>
int Stack<T>::Length()
{
return top+1;
}

template<class T>
T Stack<T>::getTop()
{
if(isEmpty()) { cout<<"堆栈是空的"<<endl; return -1; }
else return base[top] ;
}

template<class T>
Stack<T> *Stack<T>::push(T x)
{
if(isFull())
{ cout<<"堆栈满了"<<endl; return this; }
else
base[++top] = x;
return this;
}
template<class T>
Stack<T> *Stack<T>::pop(T& x)
{
if(isEmpty()) { cout<<"堆栈是空的!!"; return this; }
else
{
x = base[top--];
return this;
}
}


template<class T>
class Queue
{
public:
Queue();
~Queue() { delete [] base; }
bool isEmpty() const { return front == rear; }
bool isFull() const { return ((rear + 1) % maxQueueSize == front) ? 1 : 0 ; }
Queue<T> *enQueue(T x);
Queue<T> *deQueue(T& x);
T first() const;
private:
int front;
int rear;
T *base;
int maxQueueSize;
};

template<class T>
Queue<T>::Queue()
{
maxQueueSize = 100;
this->maxQueueSize = maxQueueSize;
base = new T[maxQueueSize];
front = rear = 0;
}
template<class T>
Queue<T> *Queue<T>::enQueue(T x)
{
if(isFull()) { cout<<"队列满了"<<endl; return this; }
else
{
rear = (rear + 1) % maxQueueSize;
base[rear] = x;
return this;
}
}

template<class T>
Queue<T> *Queue<T>::deQueue(T& x)
{
if(isEmpty()) { cout<<"队列为空"<<endl; return this; }
else
{
front = (front + 1) % maxQueueSize;
x = base[front];
return this;
}
}

template<class T>
T Queue<T>::first() const
{
if(isEmpty()) { cout<<"队列为空"<<endl; return -1; }
else return base[(front + 1) % maxQueueSize] ;
}

class FiendLanguage{
public:
FiendLanguage();
~FiendLanguage(){ delete sentence; }
FiendLanguage *translateToHumanLanguage();
friend istream& operator >>(istream& ins,FiendLanguage& first);
friend ostream& operator<<(ostream& outs,FiendLanguage& first);
private:
string A;
char *sentence;
Queue<char> q1;
};

////////////////////////////////////////////

FiendLanguage::FiendLanguage()
{
sentence = new char;
}

istream& operator >>(istream& ins,FiendLanguage& first)
{
string _B;
string _sentence;
char *q;
q = first.sentence;
cout<<"大写字母只能输A和B"<<endl;
cout<<"魔王语言输入词汇A:(任意个小写字母)"<<endl;
ins>>first.A;
cout<<"输入魔王语言词汇B:(任意个小写字母混合任意个大写字符A)"<<endl;
cin>>_B;
cout<<"输入魔王说的话:"<<endl;
cin>>_sentence;
for(int k = 0; _sentence[k] != '\0' ; k++)
{
if(_sentence[k] == 'B')
{
for(int i = 0; i < _B.length(); i++)
{
if(_B[i] == 'A')
{
for(int g = 0; g < first.A.length(); g++)
*first.sentence++ = first.A[g];
}
else
*first.sentence++ = _B[i];
}
}
else
*first.sentence++ = _sentence[k];
}
*first.sentence = '\0';
first.sentence = q;
return ins;
}

FiendLanguage *FiendLanguage::translateToHumanLanguage()
{
Stack<char> stack1(50);
char temp;
char first;
for(int i = 0;i < strlen(sentence) + 1 ; i++)
{
q1.enQueue(sentence[i]);
}
int i = 0;
while(q1.first() != '\0')
{
if(q1.first() == '(')
{
q1.deQueue(temp);
temp = first = q1.first();
while( q1.first() != ')' )
{
q1.deQueue(temp);
stack1.push(temp);
}
q1.deQueue(temp);
while( !stack1.isEmpty() )
{
q1.enQueue(first);
stack1.pop(temp);
if(temp != first)
q1.enQueue(temp);
}
}
else
{
q1.deQueue(temp);
q1.enQueue(temp);
}
}
q1.deQueue(temp);
q1.enQueue(temp);
return this;
}

ostream& operator<<(ostream& outs,FiendLanguage& first)
{
typedef struct
{
char letter;
string cn_message;
}Table;
Table translate[26]=
{
{'a', "一只" } ,
{'b', "傻B" },
{'c', "CS" },
{'d', "地" },
{'e', "鹅" },
{'f', "负" },
{'g', "赶" },
{'h', "恨"},
{'i', "爱" },
{'j', "鸡" },
{'k', "打"},
{'l', "垃圾"},
{'n', "蛋" },
{'m', "吗?"},
{'o', "饿" },
{'p', "劈" },
{'q', "强" },
{'r', "软件学院" },
{'s', "上" },
{'t', "天"},
{'u', "输"},
{'v', "赢"},
{'w', "我"},
{'x', "下" },
{'y', "洋浦" },
{'z', "追"}
};
char temp;
char *p =new char;
char *q;
q = p;
string str[100];
int i = 0;
pair<char,string> result;
outs<<"解释成小写英文是:"<<endl;
while(!first.q1.isEmpty())
{
first.q1.deQueue(temp);
*p++ = temp;

outs<<temp;
}
*p = '\0';
p = q;
outs<<endl;
outs<<"翻译成人的语言是:"<<endl;
for(int i = 0; p[i] !='\0'; i++ )
for(int j = 0; j < 26; j++)
{
if( translate[j].letter == p[i] )
outs<<translate[j].cn_message;
}

outs<<endl;
return outs;
}

int main()
{
FiendLanguage f1;
cin>>f1;
f1.translateToHumanLanguage();
cout<<f1;
system("pause");
return 0;
}

搜索更多相关主题的帖子: kai 斑竹 
2005-11-03 16:07
zinking
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:35
帖 子:916
专家分:0
注 册:2004-12-5
收藏
得分:0 
扫了一眼不就是,堆栈膜板吗?
哈哈,还是参考书自己弄吧,别人不能很快把握你的思路的
让kai改,他会给你动大手术的

http://kongfuziandlife. http://codeanddesign.
2005-11-03 20:15
琥珀之风
Rank: 1
等 级:新手上路
帖 子:54
专家分:0
注 册:2005-11-3
收藏
得分:0 
错误是这样的:你运算符重载有问题,最后析构的时候指针已经指乱了。最后delete指针的时候不能保证指针的值是正确的。最简单的方法就是把析构函数的实现注释掉。但是那样可能会导致内存泄露~

恶魔只是将人类引入堕落的深渊 天使吹响了末日审判的号角 ——恶魔的追随者
2005-11-03 21:06
想你的天空
Rank: 2
等 级:新手上路
威 望:5
帖 子:610
专家分:0
注 册:2004-12-30
收藏
得分:0 
zinking 你不明白我的意思, 程序是没问题, 我估计是编译器的问题。
琥珀之风 析够函数是我参考书弄的,绝对没错。
谢谢你们的支持, 但是还没提及问题所在。

2005-11-03 22:06
zinking
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:35
帖 子:916
专家分:0
注 册:2004-12-5
收藏
得分:0 
恩,编译器的设置各有各的一套。
我这样的一时半会而,也弄不懂。
不过我建议你 可以专门花点时间研究一下.net的编译环境设置


就我现在看的vc++环境。设置与调试就有厚厚的一本书介绍。

感觉没能帮上忙!还是要靠自己啊!

http://kongfuziandlife. http://codeanddesign.
2005-11-04 10:49
琥珀之风
Rank: 1
等 级:新手上路
帖 子:54
专家分:0
注 册:2005-11-3
收藏
得分:0 
"运行结束后弹出以个错误信息"
那个红色的错误信息,根据我的了解因该属于运行时错误8~跟编译器好似没太多的关系
"结果对,"
那是因为只有在退出程序的时候析构才被调用。输出结果在程序退出之前,所以当然没什么问题。
还有,我并不是说析构函数有问题,我的意思是析构delete的那个指针有问题。
问题可能出现在运算符重载那块
最后,写参考书的人可能对程序很明白,但是对参考书出版的地方对程序可能就不是那么明白,我在我的课本上发现了很多硬伤,参考书只是一个参考并不是什么不可推翻的定理。

恶魔只是将人类引入堕落的深渊 天使吹响了末日审判的号角 ——恶魔的追随者
2005-11-04 13:00
快速回复:只有kai斑竹能帮我了
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.094466 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved