这个例子是来自于严蔚敏的《数据结构》的栈那一节。 但是我进行了一些简单的修改,确保编译通过。
目的:利用栈 计算 “3*(7-2)”这样的字符串的算术运算的结果。 共有3个代码文件,如下:
1、mystack.h
#pragma once #define maxsize 30 typedef struct { char data[maxsize+1]; int top; }Stack; int Push(Stack& S,char x); int Pop(Stack& S,char& x); char readtop(Stack S);
2、mystack.cpp
#include "mystack.h" #include "stdio.h" int Push(Stack& S,char x) { if (S.top==maxsize) { printf("overflow\n"); return(0); } S.data[++S.top]=x; return(1); } int Pop(Stack& S,char& x) { if(S.top==0) { printf("undertflow\n"); return(0); } x=S.data[S.top]; S.top--; return(1); } char readtop(Stack S) { char a; a=S.data[S.top]; return(a); }
3、 caclstack.cpp
#include <iostream> #include <string> #include "mystack.h" using namespace std; double operate(char ch, double x,double y); int precede(char p1,char p2); double calcul(char a[]);
//这是进行测试的main 函数 int main() { char tmp[]="3*(7-2)#"; // 输入的字符串一定要以# 结尾。 // char tmp[]="3*(7-2)+5*2#"; double rst = calcul(tmp); cout<<rst<<endl; getchar(); return 0; } double operate(char ch, double x,double y) { double z; switch (ch) { case '+' : z=x+y; break; case '-' : z=x-y; break; case '*' : z=x*y; break; case '/' : z=x/y; break; } return((char)z); } //这个函数最关键 int precede(char p1,char p2) { int flag = -2; switch (p1) { case '+' : if(p2=='*' || p2=='/' || p2== '(' ) flag=-1; else flag=1; break; case '-' : if(p2=='*' || p2=='/' || p2== '(' ) flag=-1; else flag=1; break; case '*' : if(p2=='(' ) flag=-1; else flag=1; break; case '/' : if(p2=='(' ) flag=-1; else flag=1; break; case '(' : if(p2==')') flag=0; else if(p2=='#')printf("error 1 operator!\n"); else flag=-1; break; case ')' : if(p2=='(' )printf("error 2 operator!\n"); else flag=1; break; case '#' : if(p2==')' )printf("error 3 operator!\n"); else if(p2=='#' ) flag=0; else flag=-1; break; } return(flag); } double calcul(char a[]) { Stack S1, S2; S1.top = 0; S2.top = 0; double x, y, z; char x1,x2; char r, ch; int I=0; Push(S1,'#'); r=a[I]; //while(r<>'#' || readtop(S1)<>'#') while(r != '#' || readtop(S1) != '#') { if(r<='9' && r>='0') { x=0; while(r<='9' && r>='0') { x=x*10+r-'0'; r=a[++I]; } Push(S2,x); } else switch(precede(readtop(S1),r)) { case -1: Push(S1,r); r=a[++I]; break; //把运算符放进栈1 case 0: Pop(S1,ch); r=a[++I]; //r=a[I]; break; //弹出一个运算符 case 1: Pop(S1, ch); Pop(S2, x1); Pop(S2, x2); Push(S2,operate(ch, x2,x1)); //r=a[++I]; r=a[I]; break; } } return(readtop(S2)); }
以上代码在VS 下编译通过,并且执行结果正确。
注意:本文的栈 是用的自定义 的mystack。
另外更多原理 请参考 严蔚敏的数据结构相关章节。
原文:http://blog.csdn.net/zhongjling/article/details/27379801