鱼C论坛

 找回密码
 立即注册
楼主: 小甲鱼

第二十八讲 栈和队列6(视频+课件+源代码)

[复制链接]
发表于 2015-3-8 13:02:42 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-20 15:44:13 | 显示全部楼层
激动人心,无法言表! 跪舔圣天玄武大帝,西风发财红中战神。才华横溢,帅到掉渣的小甲鱼大神。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-20 15:45:53 | 显示全部楼层
demonzjf 发表于 2015-3-20 15:44
激动人心,无法言表! 跪舔圣天玄武大帝,西风发财红中战神。才华横溢,帅到掉渣的小甲鱼大神。

鱼币不够怎么办。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-18 14:14:20 | 显示全部楼层
shi_xin398 发表于 2013-9-16 13:55
小甲鱼 不知道你能不能看到我的回复
你的程序有问题
当输入2*3/4

乘除的优先级是一样的吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-18 14:16:13 | 显示全部楼层
小甲鱼老师,这个鱼币怎么赚到呀?没有鱼币的童鞋好伤心啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-21 13:41:15 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-7-9 17:34:54 | 显示全部楼层
真贵,想看和上一章合在一起的代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-21 16:48:09 | 显示全部楼层
。。。。。。。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-2-28 01:28:14 | 显示全部楼层
蜗牛般的速度慢慢前行着,真痛苦!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-6-16 12:36:52 | 显示全部楼层
加油
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-7-25 21:10:46 | 显示全部楼层
小甲鱼,你在这一讲的视频里说会把完整的源代码放在论坛里,可是这个代码还只是你视频里讲的那些啊! 能不能把中缀表达式变成后缀表达式,然后再计算出来的代码分享一下,我水平比较低,谢谢了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-9-19 22:25:43 | 显示全部楼层
好贵啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-9-20 15:40:01 | 显示全部楼层
有没有两个程序合并的啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-4 19:39:07 | 显示全部楼层
求合并的代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-5 11:43:42 | 显示全部楼层
小甲鱼,你程序中当乘除或者左括号直接进栈,那么就会有一个问题,如果栈里面本来就有一个*或者/,不应该也要把之前那个*和/输出吗?比如说,输入2*2*2 你的程序结果就会是2 2 2 * *,但是不应该是2 2 * 2 *吗?
对于2+2+2,结果是2 2 + 2 +,这和程序结果一样,是因为程序中有输出栈里之前优先级高的。我觉得在乘除那边应该也要这么做吧?~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-28 19:22:43 | 显示全部楼层
学习中,我的代码调试老是出问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-21 12:42:10 | 显示全部楼层
哪里有一次下完所有课程视频和代码的压缩包
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-27 20:16:06 | 显示全部楼层
本帖最后由 yzw 于 2017-5-27 20:17 编辑

不是说有合并之后的代码吗,怎么没有啊!

创建 和 计算 逆波兰式子的函数用到的结构体不一样啊,一个用double型、一个用char型
难道我要定义两个结构体,写两个Pop 两个Push 两个InitStack 两个 StackLen吗?求解答。

今天就是因为一直想不明白这点才决定买VIP下载代码看看的,结果发现没有这个代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-4 19:29:38 | 显示全部楼层

这个是头文件的内容:

  1. //栈操作基本表达式运算头文件
  2. //创建人:mingming
  3. //创建时间:2017.8.4
  4. //最后修改时间:2017.8.4


  5. #ifndef CACULATE_H
  6. #define CACULATE_H

  7. typedef double ElemType;       //数字栈空间元素类型
  8. typedef char   ElemType2;      //运算符栈空间元素类型
  9. #define MAX_INIT_SIZE 20       //初始化的栈空间
  10. #define NEW_SIZE 10                           //每次新增的栈空间
  11. #define MAX_BUFFER 10          //数字识别的缓冲区

  12. //定义一个栈
  13. typedef struct
  14. {
  15.         ElemType *base;
  16.         ElemType *top;
  17.         int StackSize;
  18. } sqStack;

  19. bool InitStack(sqStack *s)
  20. {
  21.         s->base = new ElemType[MAX_INIT_SIZE];
  22.         if(!s->base)
  23.                 return false;
  24.         s->top = s->base;
  25.         s->StackSize = MAX_INIT_SIZE;
  26.         return true;
  27. }

  28. bool push(sqStack *s , ElemType e)
  29. {
  30.         if((s->top - s->base) >= s->StackSize)
  31.         {
  32.                 s->base = (ElemType *)realloc(s->base , ( NEW_SIZE + s->StackSize )* sizeof( ElemType ));
  33.                 if( !s->base )
  34.                         return false;
  35.                 s->top = s->base + s->StackSize;
  36.                 s->StackSize += NEW_SIZE;
  37.         }

  38.         *(s->top) = e;
  39.         s->top++;
  40.         return true;
  41. }

  42. bool pop(sqStack *s ,ElemType *e)
  43. {
  44.         if(s->top == s->base)
  45.                 return false;
  46.         s->top--;
  47.         *e = *s->top;
  48.         return true;
  49. }
  50. //求栈当前长度
  51. int StackLen(sqStack s)
  52. {
  53.         return ( s.top - s.base );
  54. }


  55. //对上面的各个方法进行重载
  56. typedef struct
  57. {
  58.         ElemType2 *base;
  59.         ElemType2 *top;
  60.         int StackSize;
  61. } midStack;

  62. bool InitStack(midStack *s)
  63. {
  64.         s->base = new ElemType2[MAX_INIT_SIZE];
  65.         if(!s->base)
  66.                 return false;
  67.         s->top = s->base;
  68.         s->StackSize = MAX_INIT_SIZE;
  69.         return true;
  70. }

  71. bool push(midStack *s , ElemType2 e)
  72. {
  73.         if((s->top - s->base) >= s->StackSize)
  74.         {
  75.                 s->base = (ElemType2 *)realloc(s->base , ( NEW_SIZE + s->StackSize )* sizeof( ElemType2 ));
  76.                 if( !s->base )
  77.                         return false;
  78.                 s->top = s->base + s->StackSize;
  79.                 s->StackSize += NEW_SIZE;
  80.         }

  81.         *(s->top) = e;
  82.         s->top++;
  83.         return true;
  84. }

  85. bool pop(midStack *s ,ElemType2 *e)
  86. {
  87.         if(s->top == s->base)
  88.                 return false;
  89.         s->top--;
  90.         *e = *s->top;
  91.         return true;
  92. }
  93. //求栈当前长度
  94. int StackLen(midStack s)
  95. {
  96.         return ( s.top - s.base );
  97. }

  98. #endif
复制代码


这个是cpp文件的内容,用的时候要包含上面头文件
  1. #include<iostream>
  2. #include<ctype.h>
  3. #include"Caculate.h"

  4. #define MAXBUFFER 50  //存放后缀表达式的最大缓冲区长度


  5. //中缀表达式转换为后缀表达式
  6. void MidtoLast(char *lastbuf)
  7. {
  8.         std::cout << "请输入表达式!以#作为结束标志\n";
  9.         midStack stack;
  10.         InitStack(&stack);     //操作符的栈初始化

  11.         int i=0;
  12.         char c;
  13.         char temp;
  14.         std::cin.get(c);
  15.         while( '#' != c )       //输入以#作为结束符
  16.         {
  17.                 if( isdigit(c) || c=='.' )         //对读取到的数字处理,使得数字放在一起,并且一个数字后面有一个空格
  18.                 {
  19.                         while(isdigit(c) || c=='.')
  20.                         {
  21.                                 lastbuf[i++] = c;
  22.                                 lastbuf[i] = ' ';
  23.                                 std::cin.get(c);   
  24.                         }
  25.                                 i++;                         //保护一个数字完了之后的空格不变
  26.                 }
  27.                
  28.                 switch( c )
  29.                 {
  30.                         case '+':                        // + 只要前面有非括号运算符,就应该先出栈
  31.                                 if(stack.top == stack.base)
  32.                                 {
  33.                                         push( &stack , c );
  34.                                 }
  35.                                 else
  36.                                 {
  37.                                         do
  38.                                         {
  39.                                                 pop( &stack , &temp );
  40.                                                 if( '(' == temp )
  41.                                                 {
  42.                                                         push( &stack , temp );
  43.                                                 }
  44.                                                 else
  45.                                                 {
  46.                                                         lastbuf[i++] = temp;
  47.                                                         lastbuf[i++] = ' ';
  48.                                                 }
  49.                                         }while( '(' != temp && StackLen(stack));
  50.                                         push( &stack , c );
  51.                                 }
  52.                                 break;
  53.                         case '-':                       //  - 只要前面有非括号运算符,就应该先出栈
  54.                                 if(stack.top == stack.base)
  55.                                 {
  56.                                         push( &stack , c );
  57.                                 }
  58.                                 else
  59.                                 {
  60.                                         do
  61.                                         {
  62.                                                 pop( &stack , &temp );
  63.                                                 if( '(' == temp )
  64.                                                 {
  65.                                                         push( &stack , temp );
  66.                                                 }
  67.                                                 else
  68.                                                 {
  69.                                                         lastbuf[i++] = temp;
  70.                                                         lastbuf[i++] = ' ';
  71.                                                 }
  72.                                         }while( '(' != temp && StackLen(stack));
  73.                                         push( &stack , c );
  74.                                 }
  75.                                 break;
  76.                         case '*':                           //   * / 需要那顺序计算,谁在先,先算谁
  77.                                 if(stack.top == stack.base)
  78.                                 {
  79.                                         push( &stack , c );
  80.                                 }
  81.                                 else
  82.                                 {
  83.                                         pop( &stack , &temp );
  84.                                         if( '*'==temp || '/'==temp  )
  85.                                         {
  86.                                                 lastbuf[i++] = temp;
  87.                                                 lastbuf[i++] = ' ';
  88.                                         }
  89.                                         else
  90.                                         {
  91.                                                 push( &stack , temp );
  92.                                         }
  93.                                                 push( &stack , c );
  94.                                 }
  95.                                 break;
  96.                         case '/':                    //   * / 需要那顺序计算,谁在先,先算谁
  97.                                 if(stack.top == stack.base)
  98.                                 {
  99.                                         push( &stack , c );
  100.                                 }
  101.                                 else
  102.                                 {
  103.                                         pop( &stack , &temp );
  104.                                         if( '*'==temp || '/'==temp  )
  105.                                         {
  106.                                                 lastbuf[i++] = temp;
  107.                                                 lastbuf[i++] = ' ';
  108.                                         }
  109.                                         else
  110.                                         {
  111.                                                 push( &stack , temp );
  112.                                         }
  113.                                                 push( &stack , c );
  114.                                 }
  115.                                 break;
  116.                         case '(':
  117.                                 push(&stack , c);
  118.                                 break;
  119.                         case ')':       //括号配对,知道碰见左括号
  120.                                 pop( &stack , &temp );
  121.                                 while( '(' != temp )
  122.                                 {
  123.                                         lastbuf[i++] = temp;
  124.                                         lastbuf[i++] = ' ';
  125.                                         pop( &stack , &temp );
  126.                                 }
  127.                                 break;
  128.                 }
  129.                 if( '#' != c)     // 如果前面数字处理时已经读到了#,就不需要再读了
  130.                 {
  131.                         std::cin.get(c);
  132.                 }
  133.                
  134.         }
  135.         while( stack.top != stack.base )    //把栈里面没有用到的符号全部弹出来
  136.         {
  137.                 pop( &stack , &lastbuf[i++] );
  138.                 lastbuf[i++] = ' ';
  139.         }
  140.         lastbuf[i] = '\0';       //数组最后的结束符,防止内存泄漏
  141. }

  142. ElemType caculate(char *lastbuf)
  143. {
  144.         sqStack s;
  145.         InitStack( &s );
  146.         int i = 0,bufcount=0;
  147.         double d,e;

  148.        
  149.         char c , str[MAX_BUFFER];
  150.         c = lastbuf[bufcount++];

  151.         while(c != '\0')
  152.         {
  153.                 while( isdigit(c) || c=='.')          //数字处理,把连续的数字转换为一个double型
  154.                 {
  155.                         str[i++] = c;
  156.                         str[i] = '\0';
  157.                         if( i>=10 )
  158.                         {
  159.                                 std::cout << "输入的数字位数过多!\n";
  160.                         }
  161.                         c = lastbuf[bufcount++];
  162.                         if(  ' '== c )           // 碰见空格说明一个数字完了
  163.                         {
  164.                                 d = atof(str);
  165.                                 push( &s , d );
  166.                                 i = 0;
  167.                                 break;
  168.                         }
  169.                 }

  170.                 switch( c )
  171.                 {
  172.                         case '+':
  173.                                 pop( &s , &e );
  174.                                 pop( &s , &d);
  175.                                 push(&s , d+e);
  176.                                 break;
  177.                         case '-':
  178.                                 pop( &s , &e );
  179.                                 pop( &s , &d );
  180.                                 push(&s , d-e);
  181.                                 break;
  182.                         case '*':
  183.                                 pop( &s , &e );
  184.                                 pop( &s , &d );
  185.                                 push(&s , d*e);
  186.                                 break;
  187.                         case '/':
  188.                                 pop( &s , &e );
  189.                                 pop( &s , &d );
  190.                                 if( e != 0 )
  191.                                 {
  192.                                         push(&s , d/e);
  193.                                 }
  194.                                 else
  195.                                 {
  196.                                         std::cout << "除数为0,错误!\n";
  197.                                         return -1;
  198.                                 }
  199.                                 break;
  200.                 }
  201.                 c = lastbuf[bufcount++];  
  202.         }
  203.         pop(&s , &d);      //最终计算结果弹出到 d 中   
  204.         return d;
  205. }


  206. int main()
  207. {
  208.         char lastbuf[MAXBUFFER]; //后缀表达式缓冲区

  209.         MidtoLast(lastbuf);     //中缀转后缀
  210.        
  211.         std::cout << "运算结果为" << caculate(lastbuf) << std::endl;

  212.         return 0;
  213. }
复制代码


还有注意一下,甲鱼老师的中缀转换后缀有些问题,加减法 或者 乘除法 需要按照顺序求,就是说需要先判断站定是否有相同优先级或高优先级的运算符,如果有,就要先出栈,然后再进行压栈操作!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2017-8-4 19:31:09 | 显示全部楼层
yzw 发表于 2017-5-27 20:16
不是说有合并之后的代码吗,怎么没有啊!

创建 和 计算 逆波兰式子的函数用到的结构体不一样啊,一个用d ...

对的,需要两个栈,可以看我在下面发的代码 !
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 10:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表