栈和队列的实际应用

布满荆棘的人生 2022-02-01 15:19 394阅读 0赞

1.将一个非负的十进制整数N转换成其他D进制数。

解决思路,连续取模%和整除/。D进制各数位的产生顺序是从低位到高位,而输出顺序却是从高位到低位,刚好相反,可以考虑使用栈进行逆序输出。

  1. public static string DecConvert(int N,int D)
  2. {
  3. if (D < 2 || D > 16)
  4. {
  5. throw new ArgumentOutOfRangeException("二进制至十六进制之间转换");
  6. }
  7. Stack<char> stack = new Stack<char>();
  8. do
  9. {
  10. int res = N % D;
  11. char c = (res < 10) ? (char)(res + 48) : (char)(res + 55);
  12. stack.Push(c);
  13. }
  14. while ((N = N / D) != 0);//为0的时候,除到最后一位了
  15. string s = string.Empty;
  16. while (stack.Count > 0)
  17. {
  18. s += stack.Pop().ToString();
  19. }
  20. return s;
  21. }

算法中十进制0和字符0 差48,在转换的过程中要加上48.

字母A 为65,比十大55,如下图所示:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2huem1kbGhj_size_16_color_FFFFFF_t_70

测试结果:

  1. Console.WriteLine(StackApplication.DecConvert(13245,16)); Console.WriteLine(StackApplication.DecConvert(1238, 8));
  2. Console.WriteLine(StackApplication.DecConvert(2263, 2));
  3. Console.ReadKey();

20190514212231975.png

2.杨辉三角问题

20190514214552268.png

我们观察可知,该三角除了每一行的第一个元素和最后一个元素是1,其他元素的值是上一行与之相邻的两个元素之和。

算法思路:首先将要打印的数据依次进队,然后在打印每行除两端数据时,依据出队元素计算得出。

  1. Queue<int> que = new Queue<int>();
  2. int left=0, right = 0;
  3. Console.Write("请输入行数");
  4. int n = int.Parse(Console.ReadLine());
  5. for (int i = 0; i < n; i++)
  6. {
  7. for (int j = 1; j < n - i; j++)
  8. {
  9. //输出各行的空格数
  10. Console.Write(" ");
  11. }
  12. //每行有i+1 个元素
  13. for (int k = 0; k <= i; k++)
  14. {
  15. int num = 1;
  16. if (k != i)
  17. {
  18. right = (int)que.Dequeue();
  19. if (k != 0)
  20. {
  21. num = left + right;
  22. }
  23. left = right;
  24. }
  25. //右对齐,四个长度
  26. Console.Write(string.Format("{0,-4}", num.ToString()));
  27. que.Enqueue(num);
  28. }
  29. Console.WriteLine();
  30. }

3.回文判断,正读和反读都相同的字符序列,如abba,abcba。设计一个算法判断输入的字符序列 是否为回文。

思路:利用队列和栈的特性,一个是先进先出,一个是先进后出

  1. Console.Write("请输入一个字符序列:");
  2. string str = Console.ReadLine();
  3. Queue<char> Que = new Queue<char>();
  4. Stack<char> Sta = new Stack<char>();
  5. for (int i = 0; i < str.Length; i++)
  6. {
  7. Que.Enqueue(str[i]);
  8. Sta.Push(str[i]);
  9. }
  10. if (str.Length > 1)
  11. {
  12. if (Que.Dequeue()==Sta.Pop())
  13. {
  14. Console.WriteLine("您输入的是回文");
  15. }
  16. else
  17. {
  18. Console.WriteLine("您输入的不是回文");
  19. }
  20. }
  21. else
  22. {
  23. Console.WriteLine("请正确输入...");
  24. }

发表评论

表情:
评论列表 (有 0 条评论,394人围观)

还没有评论,来说两句吧...

相关阅读

    相关 理解

    一.栈 1.1 概念 栈 :一种 特殊的线性表 ,其 只允许在固定的一端进行插入和删除元素操作 。 进行数据插入和删除操作的一端称为栈 顶,另一端称为栈底。 栈中的数据元

    相关 应用之停车问题

    题目: > 设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车

    相关 堆、区别

    1、堆和栈 1)堆(完全二叉树,可以看成一棵树的数组对象)是指程序运行时申请的动态内存,而栈只是指一种使用堆的方法(即先进后出); 2)堆是在程序运行时,而不是在程序编译时

    相关 相互实现

    前言 栈和队列作为两种典型的线性表,有着非常鲜明甚至可以说是相互对立的特点;栈先进后出(后进先出),队列先进先出(后进后出)。因此,对相同的输入,两者会产生恰好截然相反的

    相关 区别

    1.队列先进先出,栈先进后出。 对插入和删除操作的"限定"。 栈是限定只能在表的一端进行插入和删除操作的线性表。 队列是限定只能在表的一端进行插入和在另一端进行删除操作的线性

    相关 实际应用

    1.将一个非负的十进制整数N转换成其他D进制数。 解决思路,连续取模%和整除/。D进制各数位的产生顺序是从低位到高位,而输出顺序却是从高位到低位,刚好相反,可以考虑使用栈进行