你这不会是数据结构的课程设计吧,我做过完全符合要求的程序,我的文库地址为
http://wenku.baidu.com/view/ea931715b7360b4c2e3f6474?fr=prin下载即是源代码。
这里既然给了20分,就不好意思让您再掏两财富值下载了,不过原下载地址我给出了阳历输入和输出,您要是不满意和以对源程序稍作修改。
#include<iostream>
#include<string.h>
using namespace std;
#define STACK_INIT_SIZE 100
#define INCRESEMENT 10
#define OVERFLOW 0
#define ERROR 0
typedef struct//栈的结构体的定义
{
char *base;
char *top;
int stacksize;
}stack;
void initstack(stack &s)//栈的初始化
{
s.base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));
if(!s.base)
exit(OVERFLOW);
s.top=s.base;
}
char gettop(stack s)//获取栈顶元素并用e返回
{
char e;
if(s.top==s.base)
exit(ERROR);
e=*(s.top-1);
return e;
}
void push(stack &s,char e)//把数据元素e压到栈s中
{
if(s.top-s.base==s.stacksize)
{
s.base=(char *)realloc(s.base,(s.stacksize+INCRESEMENT)*sizeof(char));
if(!s.base)
exit(OVERFLOW);
s.top=s.base+s.stacksize;
s.stacksize=s.stacksize+INCRESEMENT;
}
*(s.top++)=e;
}
void pop(stack &s,char&e)//栈顶元素出栈,并用e返回
{
if(s.top==s.base)
exit(ERROR);
e=*(--s.top);
}
bool in(char c)//判断字符c是否为表达式运算符,若是返回true,否返回false
{
if((c=='+')||(c=='-')||(c=='*')||(c=='/')||(c=='#')||(c=='(')||(c==')'))
return true;
else
return false;
}
char Precede(char a,char b)//对运算符a和b优先级进行比较并返回比较结果
{
if(a=='+'||a=='-')
{
if(b=='*'||b=='/'||b=='(')
return '<';
else
return '>';
}
if(a=='*'||a=='/')
{
if(b=='(')
return '<';
else
return '>';
}
if(a=='(')
{
if(b==')')
return '=';
else if(b!='#')
return '<';
}
if(a==')')
{
if(b!='(')
return '>';
}
if(a=='#')
{
if(b=='#')
return '=';
else if(b!=')')
return '<';
}
}
int operate(char a,chartheta,char b)//对字符a和b按其字面值进行运算
{
if(theta=='+')
return (a-48)+(b-48);
if(theta=='-')
return a-b;
if(theta=='*')
return (a-48)*(b-48);
if(theta=='/')
return (a-48)/(b-48);
}
void main()//主函数
{
cout<<"copyright to:大连海洋大学-计算机09-1-张世恒!感谢您的下载和使用!"<<endl;
stack optr,opnd;
initstack(optr);
initstack(opnd);
push(optr,'#');
cout<<"Input:#";
char c;
char x,theta;
char a,b;
c=getchar();
while(c!='#'||gettop(optr)!='#')
{
if (!in(c)) //不是运算符则进opnd栈
{
push(opnd,c);
c=getchar();
if(!in(c)) //若连续输入两个数字字符,实现两个数字字符的连接
{
char c1=c;
pop(opnd,c);
c=(char)((c-48)*10+(int)(c1));
}
}
else
{
switch(Precede(gettop(optr),c))
{
case'<': //栈顶元素有限权低
{
push(optr,c);
c=getchar();
break;
}
case'=': //脱括号并接收下一个字符
{
pop(optr,x);
c=getchar();
break;
}
case'>': //退栈并将运算结果入栈
{
pop(optr,theta);
pop(opnd,b);
pop(opnd,a);
char c1;
c1=(char)(operate(a,theta,b)+48);
push(opnd,c1);
break;
}
}//switch
}//else
}//while
cout<<"output:"<<(int)gettop(opnd)-48<<endl;
}//main