| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1268 人关注过本帖
标题:[求助]用顺序栈实现简单的运算
只看楼主 加入收藏
guosheng1987
Rank: 1
等 级:新手上路
帖 子:59
专家分:0
注 册:2007-4-16
收藏
 问题点数:0 回复次数:4 
[求助]用顺序栈实现简单的运算

从屏幕输入运算式子,如1+2*(4-3)/1
输出计算结果,结果不正确,前面创建顺序栈模板都没有问题,不知道后面那里错了

#include "cstdlib"
#include "cstdio"
#include "iostream"
using namespace std;
template <class T> //类模板
class sq_Stack
{
public:
sq_Stack(int c){cap = c;} //构造函数,初始化栈的容量
void create_Stack(); //创建一个顺序栈
int check_Stack(); //检验栈
void enter_Stack(T); //入栈
T quit_Stack(); //退栈
T read_Top(); //读栈顶元素
void show_Stack();
void delete_Stack(); //释放空间


private:
int len; //栈的长度
int cap; //栈的容量
T *s; //指针用于指向开辟的空间
int top; //栈顶指针
};
//创建顺序栈
template <class T>
void sq_Stack<T>::create_Stack()
{
s = new T[cap]; //开辟一个空间,指针指向栈首地址
top = 0;
}
//检验栈
template <class T>
int sq_Stack<T>::check_Stack()
{
if(top == 0) return 0;
else if(top == cap) return -1;
else return 1;
}
//入栈运算
template <class T>
void sq_Stack<T>::enter_Stack(T num)
{
if(top == cap){cout << "上溢错误" << endl;return;} //栈满,发生上溢错误
top++;
s[top-1] = num;

}
//退栈运算
template <class T>
T sq_Stack<T>::quit_Stack()
{
T temp;
if(top == 0){cout << "下溢错误" << endl;return 0;} //发生下溢错误
temp = s[top-1];
top--;
return temp;
}
//读栈顶元素
template <class T>
T sq_Stack<T>::read_Top()
{
if(top == 0){cout << "栈为空" << endl;return 0;} //空栈
return s[top-1];
}
//输出栈
template <class T>
void sq_Stack<T>::show_Stack()
{
int i;
for(i = 0;i<top;i++)
cout << s[i] << " ";
cout << endl;
}
//释放空间
template <class T>
void sq_Stack<T>::delete_Stack()
{
delete []s;
}


double convert(char *,int); //转化字符到数字
int priority(char); //运算符栈的优先级别
int main()
{

sq_Stack<double> OVstack(30); //新建建操作数栈对象
sq_Stack<char> OPstack(30); //新建运算符栈对象

OVstack.create_Stack(); //创建操作数栈
OPstack.create_Stack(); //创建运算符栈

OPstack.enter_Stack('\0'); //首先在运算符栈压入结束符号.


char s[20],c;
int i = 0,flag = 1;
double a,b; //
gets(s); //输入待运算的字符.



while(flag)
{
//如果输入的是数字字符或小数点,转化为数字,入操作数栈
if(s[i]>='0'&& s[i]<='9'||s[i]=='.')
OVstack.enter_Stack(convert(s,i));
//如果当前字符为"("或者优先级别大于运算符栈顶元素的优先级别 ,
else if(s[i]=='('||priority(s[i])>priority(OPstack.read_Top()))
{
OPstack.enter_Stack(s[i]);//当前运算符入栈
i++; //扫描指针进一
}
//如果当前字符为结束符号或者当前运算符的栈顶元素为结束符号,退出循环.
else if(s[i]=='\0'&&OPstack.read_Top()=='\0')
{
flag = 0;
}
//如果当前字符为")",并且当前运算符栈顶元素为"("
else if(s[i]==')'&&OPstack.read_Top()=='(')
{
OPstack.quit_Stack(); //当前运算符出栈;
i++; //扫描指针进一
}
//如果当前字符优先级别小于运算符栈顶元素的优先级别 ,
else if(priority(s[i])<=priority(OPstack.read_Top()))
{
a = OVstack.quit_Stack(); //出栈两个元素
b = OVstack.quit_Stack();
//运算结果重新入操做数栈
switch(OPstack.quit_Stack()) //当前出栈的运算符
{
case '+':OVstack.enter_Stack(a+b);break;
case '-':OVstack.enter_Stack(a-b);break;
case '*':OVstack.enter_Stack(a*b);break;
case '/':OVstack.enter_Stack(a/b);break;
}
}

}
cout << OPstack.read_Top() << endl; //计算结果

OVstack.delete_Stack(); // 释放空间
OPstack.delete_Stack();
system("pause");
return 0;
}
//转化字符为数字
double convert(char *s,int rec)
{
double x = 0.0,y = 1.0;
int flag = 1;
while(s[rec]>='0'&&s[rec]<='9'||s[rec]=='.')
{
if(s[rec]>='0'&&s[rec]<='9')
if(flag) //整数部分
{
x = 10*x+(s[rec]-48);
}
else
{
y = y*0.1,x = x + y*(s[rec]-48); //小数部分 整数部分累加
}
else flag = 0; //flag = 0表示标记小数部分
rec++; //扫描指针进一,直到扫描完当前的一个数.
}
return x;
}
//运算符优先级别
int priority(char c)
{
int k;
//按照优先级别返回
switch(c)
{
case '*':k = 2;break;
case '/':k = 2;break;
case '+':k = 1;break;
case '-':k = 1;break;
case '(':k = 0;break;
case ')':k = 0;break;
case '\0':k = -1;break;
}
return k;
}

搜索更多相关主题的帖子: 顺序 运算 
2007-05-12 09:37
guosheng1987
Rank: 1
等 级:新手上路
帖 子:59
专家分:0
注 册:2007-4-16
收藏
得分:0 

没人愿意帮我看一下吗

2007-05-12 10:38
cbingli
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2007-4-12
收藏
得分:0 

找到了三处错误:

#include <cstdlib>
#include <cstdio>
#include <iostream>
using namespace std;
template <class T> //类模板
class sq_Stack
{
public:
sq_Stack(int c){cap = c;} //构造函数,初始化栈的容量
void create_Stack(); //创建一个顺序栈
int check_Stack(); //检验栈
void enter_Stack(T); //入栈
T quit_Stack(); //退栈
T read_Top(); //读栈顶元素
void show_Stack();
void delete_Stack(); //释放空间


private:
int len; //栈的长度
int cap; //栈的容量
T *s; //指针用于指向开辟的空间
int top; //栈顶指针
};
//创建顺序栈
template <class T>
void sq_Stack<T>::create_Stack()
{
s = new T[cap]; //开辟一个空间,指针指向栈首地址
top = 0;
}
//检验栈
template <class T>
int sq_Stack<T>::check_Stack()
{
if(top == 0) return 0;
else if(top == cap) return -1;
else return 1;
}
//入栈运算
template <class T>
void sq_Stack<T>::enter_Stack(T num)
{
if(top == cap){cout << "上溢错误" << endl;return;} //栈满,发生上溢错误
top++;
s[top-1] = num;

}
//退栈运算
template <class T>
T sq_Stack<T>::quit_Stack()
{
T temp;
if(top == 0){cout << "下溢错误" << endl;return 0;} //发生下溢错误
temp = s[top-1];
top--;
return temp;
}
//读栈顶元素
template <class T>
T sq_Stack<T>::read_Top()
{
if(top == 0){cout << "栈为空" << endl;return 0;} //空栈
return s[top-1];
}
//输出栈
template <class T>
void sq_Stack<T>::show_Stack()
{
int i;
for(i = 0;i<top;i++)
cout << s[i] << " ";
cout << endl;
}
//释放空间
template <class T>
void sq_Stack<T>::delete_Stack()
{
delete []s;
}


double convert(char *,int); //转化字符到数字
int priority(char); //运算符栈的优先级别
int main()
{

sq_Stack<double> OVstack(30); //新建建操作数栈对象
sq_Stack<char> OPstack(30); //新建运算符栈对象

OVstack.create_Stack(); //创建操作数栈
OPstack.create_Stack(); //创建运算符栈

OPstack.enter_Stack('\0'); //首先在运算符栈压入结束符号.


char s[20];
int i = 0,flag = 1;
double a,b; //
gets(s); //输入待运算的字符.



while(flag)
{
//如果输入的是数字字符或小数点,转化为数字,入操作数栈
if(s[i]>='0'&& s[i]<='9'||s[i]=='.')
{
OVstack.enter_Stack(convert(s,i));
i++;//扫描指针进一
}
//如果当前字符为"("或者优先级别大于运算符栈顶元素的优先级别 ,
else if(s[i]=='('||priority(s[i])>priority(OPstack.read_Top()))
{
OPstack.enter_Stack(s[i]);//当前运算符入栈
i++; //扫描指针进一
}
//如果当前字符为结束符号或者当前运算符的栈顶元素为结束符号,退出循环.

else if(s[i]=='\0'&&OPstack.read_Top()=='\0')
{
flag = 0;
}
//如果当前字符为")",并且当前运算符栈顶元素为"("
else if(s[i]==')'&&OPstack.read_Top()=='(')
{
OPstack.quit_Stack(); //当前运算符出栈;
i++; //扫描指针进一
}
//如果当前字符优先级别小于运算符栈顶元素的优先级别 ,
else if(priority(s[i])<=priority(OPstack.read_Top()))
{
b = OVstack.quit_Stack(); //出栈两个元素
a = OVstack.quit_Stack();//出栈顺序错了

//运算结果重新入操做数栈
switch(OPstack.quit_Stack()) //当前出栈的运算符
{
case '+':OVstack.enter_Stack(a+b);break;
case '-':OVstack.enter_Stack(a-b);break;
case '*':OVstack.enter_Stack(a*b);break;
case '/':OVstack.enter_Stack(a/b);break;
}
}

}

//得输出操作数栈中的元素
cout << OVstack.read_Top() << endl; //计算结果

OVstack.delete_Stack(); // 释放空间
OPstack.delete_Stack();
system("pause");
return 0;
}
//转化字符为数字
double convert(char *s,int rec)
{
double x = 0.0,y = 1.0;
int flag = 1;
while(s[rec]>='0'&&s[rec]<='9'||s[rec]=='.')
{
if(s[rec]>='0'&&s[rec]<='9')
if(flag) //整数部分
{
x = 10*x+(s[rec]-48);
}
else
{
y = y*0.1;x = x + y*(s[rec]-48); //小数部分 整数部分累加
}
else flag = 0; //flag = 0表示标记小数部分
rec++; //扫描指针进一,直到扫描完当前的一个数.
}
return x;
}
//运算符优先级别
int priority(char c)
{
int k;
//按照优先级别返回
switch(c)
{
case '*':k = 2;break;
case '/':k = 2;break;
case '+':k = 1;break;
case '-':k = 1;break;
case '(':k = 0;break;
case ')':k = 0;break;
case '\0':k = -1;break;
}
return k;
}

2007-05-12 17:21
guosheng1987
Rank: 1
等 级:新手上路
帖 子:59
专家分:0
注 册:2007-4-16
收藏
得分:0 

真是太感谢了,

2007-05-12 17:55
guosheng1987
Rank: 1
等 级:新手上路
帖 子:59
专家分:0
注 册:2007-4-16
收藏
得分:0 
但是现在整数运算结果是正确的,加了小数结果就不正确了.
2007-05-12 18:03
快速回复:[求助]用顺序栈实现简单的运算
数据加载中...
 
   



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

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