分享
 
 
 

基于堆栈的一位整数中缀表达式计算器, 用C++编写

王朝c/c++·作者佚名  2006-11-21
窄屏简体版  字體: |||超大  

很简单, 还有些不太完善, 只支持一位整数.

http://www.ideawu.net/person/compilersrc/stack_cal.cpp.html

因为有朋友表示, ideawu.net无法访问, 所以我把源码拷贝到这里.

1 /*******************************************

2 * file: stack_cal.cpp

3 * author: ideawu

4 * date: 2006-11-17

5 *******************************************/

6

7 #include <stdio.h>

8 #include <stdlib.h>

9 #include <string.h>

10

11 typedef enum{

12 Token_Error = 0,

13 Token_Int = 'i',

14 Token_Div = '/',

15 Token_Mul = '*',

16 Token_Sub = '-',

17 Token_Add = '+',

18 Token_Mod = '%',

19 Token_Lp = '(',

20 Token_Rp = ')'

21 }TokenType;

22

23 class Token{

24 public:

25 int type;

26 double value;

27

28 Token(){

29 type = Token_Error;

30 value = 0;

31 }

32 };

33

34 class ArrayStack{

35 private:

36 char * name;

37 Token *tokens;

38 int size;

39 int capacity;

40

41 public:

42 ArrayStack(char* n){

43 name = n;

44 size = 0;

45 capacity = 256;

46 tokens = new Token[capacity];

47 }

48

49 ~ArrayStack(){

50 delete[] tokens;

51 }

52

53 int getSize(){

54 return size;

55 }

56

57 bool isEmpty(){

58 return (size == 0);

59 }

60

61 bool isFull(){

62 return (size == capacity);

63 }

64

65 void push(Token token){

66 if(size < capacity){

67 tokens[size ++] = token;

68 }else{

69 }

70 }

71

72 Token* pop(){

73 if(size > 0){

74 size --;

75 return &tokens[size];

76 }else{

77 return NULL;

78 }

79 }

80

81 Token* peek(){

82 if(size > 0){

83 return &tokens[size-1];

84 }else{

85 return NULL;

86 }

87 }

88

89 void toString(){

90 if(size == 0){

91 printf("%s[0]=\n", name);

92 return;

93 }

94 printf("%s[%d]=", name, size);

95 printf("(");

96 printf("{%c,%.4f}", tokens[0].type, tokens[0].value);

97 for(int i=1; i<size; i++){

98 printf(", {%c,%.4f}", tokens[i].type, tokens[i].value);

99 }

100 printf(")\n");

101 }

102 };

103

104 /*

105 * 归约函数, 从操作数栈和操作符栈各弹出一个元素,

106 * 与操作数栈顶的元素(并未弹出)运算后, 结果存在操作栈顶的元素中.

107 */

108 void calculate(ArrayStack &operandStack, ArrayStack &operatorStack){

109 if(operandStack.getSize() < 2){

110 return;

111 }

112 Token *t1 = operandStack.pop();

113 Token *t2 = operandStack.peek();

114 Token *op = operatorStack.pop();

115 switch(op->type){

116 case '*':

117 t2->value *= t1->value;

118

break;

119 case '/':

120 t2->value /= t1->value;

121

break;

122 case '+':

123 t2->value += t1->value;

124

break;

125 case '-':

126 t2->value -= t1->value;

127

break;

128 default:

129 printf("*********Syntax Error!*********\n");

130 exit(1);

131

break;

132 }

133 }

134

135

136 int main(int argc, char *argv[]){

137 char buffer[256];

138 if(argc > 1){

139 strcpy(buffer, argv[1]);

140 }else{

141 printf("Input the statement(1-256 characters):\n");

142 scanf("%s", buffer);

143 }

144

145 ArrayStack operandStack("operandStack ");

146 ArrayStack operatorStack("operatorStack");

147 int streamLen = strlen(buffer);

148 char c;

149 /*

150 * 需要归约的情况:

151 * 1. 当前的token是整数, 且操作符栈顶元素为'*'或'/';

152 * 2. 当前的token是')';

153 * 3. 当前的token是'+'或'-', 且操作符栈顶元素为'+'或'-';

154 */

155 for(int index=0; index<streamLen; index++){

156 c = buffer[index];

157 Token t;

158 if(c >= '0' && c <= '9'){

159 t.type = Token_Int;

160 t.value = c - '0';

161 operandStack.push(t);

162 if(!operatorStack.isEmpty()){

163 if(operatorStack.peek()->type == '*'

164 || operatorStack.peek()->type == '/'){

165 calculate(operandStack, operatorStack);

166 }

167 }

168 }else{

169 t.type = c;

170 Token *temp;

171 switch(c){

172 case ')':

173 if(operatorStack.isEmpty()){

174 printf("*********Syntax Error!*********\n");

175 exit(0);

176 }

177 temp = operatorStack.peek();

178 if(temp->type == '('){

179 // 使(int) ==> int, 即去掉整数两边的括号后再归约.

180 operatorStack.pop();

181 calculate(operandStack, operatorStack);

182 }else{

183 calculate(operandStack, operatorStack);

184 operatorStack.pop();

185 }

186

break;

187 case '-':

188 case '+':

189 if(!operatorStack.isEmpty()){

190 temp = operatorStack.peek();

191 if(temp->type == '+' || temp->type == '-'){

192 calculate(operandStack, operatorStack);

193 }

194 }

195 operatorStack.push(t);

196

break;

197 default:

198 operatorStack.push(t);

199

break;

200 }

201 }

202 }

203 calculate(operandStack, operatorStack);

204

205 printf("=%f", operandStack.pop()->value);

206 printf("\n");

207 return 0;

208 }

209

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有