码迷,mamicode.com
首页 > 其他好文 > 详细

栈应用2-无括号后缀表达式

时间:2014-11-21 14:12:48      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   ar   color   os   使用   sp   

将算数表达式a+b+c*d转换成后缀表达式ab+cd*+,就可以利用栈来实现这种有优先级的运算,因此首先可以使用栈来将一种表达式转化成对应的后缀表达式。

下面是实现的转换算法,注意不能带括号,支持+-*/运算符,stack的实现我可以去掉了错误检测,因为默认已经声明好了足够大小的栈。

栈头文件stack.h

 1 /*数组栈*/
 2 #include "iostream"
 3 #include "stdlib.h"
 4 
 5 #define  minSize 5
 6 #define  emptyStack -1
 7 #define  fullStack -2
 8 #define log(s); std::cout<<s<<std::endl;
 9 
10 typedef struct _stack_
11 {
12     int capacity;
13     int topOfStack;
14     char *Array;
15 }stack;
16 
17 stack *createStack(int maxSize)
18 {
19     stack *s;
20     if (maxSize < minSize)
21     {
22         return nullptr;
23     }
24     s = (stack *)malloc(sizeof(stack));
25     s->Array = (char *)malloc(sizeof(char) * maxSize);
26     s->capacity = maxSize;
27     s->topOfStack = emptyStack;/*初始化为空栈*/
28     return s;
29 }
30 
31 int isEmpty(stack *s)/*是否为空栈*/
32 {
33     return s->topOfStack == emptyStack;
34 }
35 
36 void push(stack *s, char data)/*压栈*/
37 {
38     ++s->topOfStack;
39     s->Array[s->topOfStack] = data;
40 }
41 
42 void pop(stack *s)/*弹出栈*/
43 {
44     if (isEmpty(s))
45     {
46         return;
47     }
48     --s->topOfStack;
49 }
50 
51 char top(stack *s)/*访问栈顶元素*/
52 {
53     if (isEmpty(s))
54     {
55         return emptyStack;
56     }
57     return s->Array[s->topOfStack];
58 }
59 
60 void makeEmpty(stack *&s)/*置空栈*/
61 {
62     free(s->Array);
63     free(s);
64     s = nullptr;
65 }

 

主函数main.cpp

 1 #include "stack.h"
 2 #include "string"
 3 
 4 int isSymbal(char s)
 5 {
 6     if (s == + || s == *||s==-||s==/)
 7     {
 8         return 1;
 9     }
10     return 0;
11 }
12 
13 int isBigger(char s1,char s2)//比较是否 s1不比s2 的优先级低
14 {
15     if (s1 == *||s1==/)//*有最高优先级
16     {
17         return 1;
18     }
19     else
20     {
21         if (s2 == *||s2==/)
22         {
23             return 0;
24         }
25         else
26             return 1;
27     }
28 }
29 
30 int main(void)
31 {
32     stack *st = createStack(10);
33     std::string s;
34     std::cin >> s;
35     char i;
36     for (auto &i:s)
37     {
38         if (isSymbal(i))
39         {
40             if (isEmpty(st))//是空栈的时候
41             {
42                 push(st, i);
43             }
44             else//不是空栈的时候
45             {
46                 if (!isBigger(top(st), i))//栈顶的字符是否比较新读取的字符优先级不小
47                 {
48                     push(st,i);
49                 }
50                 else
51                 {
52                     std::cout << top(st) << " ";
53                     pop(st);
54                     push(st, i);
55                 }
56             }
57             continue;
58         }
59         std::cout << i << " ";
60     }
61     while (!isEmpty(st))
62     {
63         std::cout << top(st) << " ";
64         pop(st);
65     }
66     std::cout << "" << std::endl;
67     system("pause");
68     return 0;
69 }

 

我使用的结果是这样:

bubuko.com,布布扣

 

如有错误,请读者指出,不胜感激。

以上。

栈应用2-无括号后缀表达式

标签:style   blog   http   io   ar   color   os   使用   sp   

原文地址:http://www.cnblogs.com/lhyz/p/4112668.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!