利用栈求表达式的值,先判断表达式是否正确,再计算。(用C语言完成)
功能要求:
(1)输入带有()、[]、{}的加减乘除混合运算表达式;
(2)先判断括号是否匹配,如果匹配错误,提示重新输入;
(3)如果表达式正确,将中缀表达式利用栈转为后缀表达式,并完成计算。
要先判断括号是否匹配,然后输出后缀表达式,最后输出结果。例:输入1+{[2*(3+4)-5]/3}+2=
http://t.csdn.cn/G44ce
我的文章中有详细的代码,可以参考一下
解答如下
#include <stdio.h>
#include <malloc.h>
#define MAXSIZE 100
using namespace std;
typedef char datatype;
typedef struct seqstack
{
datatype elem[MAXSIZE];
int top;
} seqstack;
void init(seqstack *s)
{
s->top=-1;
}
int empty(seqstack s)
{
return(s.top==-1? 1:0);
}
void push(seqstack *s,datatype x)
{
if(s->top==MAXSIZE-1)
{
exit(1);
}
s->top++;
s->elem[s->top]=x;
}
datatype pop(seqstack *s)
{
datatype x;
if(s->top==-1)
{
exit(1);
}
x=s->elem[s->top];
s->top--;
return x;
}
int match_kuohao(char c[])
{
int i=0;
seqstack *s;
s=(seqstack *)malloc(sizeof(seqstack));
init(s);
while(c[i]!='\0')
{
switch(c[i])
{
case '{':
case '[':
case '(':
push(s,c[i]);
break;
case '}':
if(!empty(*s) && pop(s)=='{' ) break;
else return 0;
case ']':
if(!empty(*s) && pop(s)=='[' ) break;
else return 0;
case ')':
if(!empty(*s) && pop(s)=='(' ) break;
else return 0;
}
i++;
}
return (empty(*s)==1);
}
#include<stdio.h>
#include<string.h>
//data top 是用来存储字符 intdata inttop 是存储整数化的数据
typedef struct Stack{
char* data;
int* intdata;
int top;
int inttop;
}Stack;
bool InitStack(Stack &s){
s.top=-1;
s.inttop=-1;
s.data=new char[20];
s.intdata=new int[20];
}
bool Pust(Stack &s,char a){
if(s.top==20)
return false;
s.top++;
s.data[s.top]=a;
}
bool Pop(Stack &s,char &e){
if(s.top==-1)
return false;
e=s.data[s.top];
s.top--;
}
bool Pustint(Stack &s,int a){
if(s.inttop==20)
return false;
s.inttop++;
s.intdata[s.inttop]=a;
}
bool Popint(Stack &s,int &e){
if(s.inttop==-1)
return false;
e=s.intdata[s.inttop];
s.inttop--;
}
int Yxj(char a){
// + - * / (优先级为 1 1 2 2 3
if(a=='+' || a=='-') return 1;
else if(a=='*' || a=='/') return 2;
else if (a=='(') return 3;
else return -1;
}
Stack CTOB(char string[]){
// (1+3)-2*8 - * +
Stack num,op;
InitStack(num);//数字栈
InitStack(op);//符号栈
for(int i=0;i<strlen(string);i++){
if(string[i]>=48 && string[i]<=57)
Pust(num,string[i]);
else{
if(op.top==-1) Pust(op,string[i]);// 符号栈为空直接入
else if(op.data[op.top]=='(') Pust(op,string[i]); //上一个符号为( 直接入
else if(string[i]==')'){
while(op.data[op.top]!='('){
char e;
Pop(op,e);
Pust(num,e);
}
char e;
Pop(op,e);
//Pust(num,e);
}
else if(Yxj(string[i])>Yxj(op.data[op.top])) Pust(op,string[i]); //优先级大于栈前一个直接入
else if(Yxj(string[i])<=Yxj(op.data[op.top])){ //优先级低于前面的
int y=op.top;
while(Yxj(op.data[y])>=Yxj(string[i])){
char e;
Pop(op,e);
y--;
Pust(num,e);
Pust(op,string[i]);
if(op.data[y]=='(') break;
}
}
}
}
while(op.top!=-1){
char e;
Pop(op,e);
Pust(num,e);
}
return num;
}
bool Compute_back(Stack back){
int f;// 前操作数
int r;//后操作数
for(int i=0;i<=back.top;i++){
if(back.data[i]>=48 & back.data[i]<=57){
Pustint(back,(int)back.data[i]-48);
}
else{
if(back.data[i]=='+'){
Popint(back,r);
Popint(back,f);
Pustint(back,f+r);
}
else if(back.data[i]=='-'){
Popint(back,r);
Popint(back,f);
Pustint(back,f-r);
}
else if(back.data[i]=='*'){
Popint(back,r);
Popint(back,f);
Pustint(back,f*r);
}
else if(back.data[i]=='/'){
Popint(back,r);
Popint(back,f);
Pustint(back,f/r);
}
}
}
printf("\n%d\n",back.intdata[back.inttop]);
}
int main()
{
char s[255];
gets(s);
if(!match_kuohao(s))
{
printf("Unbalanced");
return 0;
}
else
{
//printf("Unbalanced");
bool InitStack(Stack &s);
bool Pust(Stack &s,char a);
bool Pop(Stack &s,char &e);
Stack CTOB(char a[]);
bool Compute_back(Stack back);
int Yxj(char a);
char string[10]; //中缀表达式
//printf("输入中缀表达式\n");
//scanf("%s",&string);
Stack back=CTOB(s); //back 为中缀转后缀的栈
printf("%s",back.data);
Compute_back(back);
}
return 0;
}