| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 524 人关注过本帖
标题:[求助]用链表实现堆栈时出错,请教一下
取消只看楼主 加入收藏
jels1087101
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2006-11-12
收藏
 问题点数:0 回复次数:0 
[求助]用链表实现堆栈时出错,请教一下

#include "iostream.h"

#include "string.h"

#ifndef LL_STACK

#define LL_STACK

#include <list>

using namespace std;


template<class T>
class LLStack
{
private:
list<T> lst;
public:
LLStack(){}

void clear()
{
lst.clear();
}

bool isEmpty () const
{
return lst.empty();
}
//返回最后一个数的数值
T& topEl()
{
return lst.back();
}
//删除最后一个数并返回该数的数值
T pop()
{
T el=lst.back();
lst.pop_back();
return el;
}
//压入一个数
void push(const T& el)
{
lst.push_back(el);
}
};

#endif

char precede(char op1,char op2)//比较运算符的优先级
{
if((op1=='+')||(op1=='-'))
{
if((op2=='+')||(op2=='-')||(op2==')')||(op2=='#'))
return '>';
if((op2=='*')||(op2=='/')||(op2=='('))
return '<';
}

if((op1=='*')||(op1=='/'))
{
if((op2=='+')||(op2=='-')||(op2=='*')||(op2=='/')||(op2=='#')||(op2==')'))
return '>';
if(op2=='(')
return '<';
}

if(op1=='(')
{
if((op2=='*')||(op2=='/')||(op2=='+')||(op2=='-')||(op2=='('))
return '<';
if(op2==')')
return '=';
if(op2=='#')
return ' ';
}

if(op1==')')
{
if((op2=='*')||(op2=='/')||(op2=='+')||(op2=='-')||(op2==')')||(op2=='#'))
return '>';
if(op2=='(')
return ' ';
}

if(op1=='#')
{
if((op2=='*')||(op2=='/')||(op2=='+')||(op2=='-')||(op2=='('))
return '<';
if(op2=='#')
return '=';
if(op2==')')
return ' ';
}

return ' ';
}


int operate(int a,char b,int c)
{
switch(b)
{
case '+':
return a+b;
break;
case '-':
return a-b;
break;
case '*':
return a*b;
break;
case '/':
return a/b;
break;
default:
cout<<"出现错误"<<endl;
return 0;
}
}


void main()
{
LLStack<char> oper;
LLStack<int> numb;
char g[50];
int flag=0;
int a,b;
cout<<"输入计算公式: ";
cin>>g;
int d=strlen(g);
g[d]='#';
g[d+1]='\0';

oper.push('#');

for (int i=0;g[i]!='#'||oper.topEl()!='#';i++)
{
if(g[i]>='0'&&g[i]<='9')
{
a=g[i]-'0';
if(flag==0) numb.push(a);
else numb.push(numb.pop()*10+a);
flag=1;
}
else
{
switch(precede(oper.topEl(),g[i])) {
case '<':
oper.push(g[i]);
break;
case '=':
oper.pop();
break;
case '>':
a=numb.pop();
b=numb.pop();
numb.push(operate(b,oper.pop(),a));
break;
}
flag=0;
}
}
cout<<"the answer is "<<numb.topEl()<<endl;

}

这个程序是用链表实现堆栈,并用堆栈来实现对计算式输入求解
我把头文件的内容也一起放上去,每次不管输入什么都是出错,自己感觉就是执行到oper.push('#');这一句时出错,但又找不出错误。

main函数里是这样的,我先对输入的字符串计算式例如3*(7-2)后面加个#号,然后定义两个堆栈,一个用来存放计算符号,一个用来存放数字,先在那个存放计算符号的堆栈中压入一个#号,然后对字符串进行逐个比较,若是数字直接压入字符栈,若是计算符,用precede函数进行比较,结果是‘<’直接压入栈,是‘=’,则是脱去括号,若是‘>’则调用该符号和最上面的两个数字进行运算,将结果再压入栈。最后的结果就是数字栈中所存的一个数。
这个程序。编译没问题,运行就出错。

搜索更多相关主题的帖子: 链表 堆栈 
2006-11-13 13:23
快速回复:[求助]用链表实现堆栈时出错,请教一下
数据加载中...
 
   



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

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