棧和隊列的實際應用

1.將一個非負的十進制整數N轉換成其他D進制數。

解決思路,連續取模%和整除/。D進制各數位的產生順序是從低位到高位,而輸出順序卻是從高位到低位,剛好相反,可以考慮使用棧進行逆序輸出。

 public static string DecConvert(int N,int D)
        {
            if (D < 2 || D > 16) 
            {
                throw new ArgumentOutOfRangeException("二進制至十六進制之間轉換");
            }
            Stack<char> stack = new Stack<char>();
            do
            {
                int res = N % D;
                char c = (res < 10) ? (char)(res + 48) : (char)(res + 55);
                stack.Push(c);
            }
            while ((N = N / D) != 0);//爲0的時候,除到最後一位了
            string s = string.Empty;
            while (stack.Count > 0) 
            {
                s += stack.Pop().ToString();
            }
            return s;
        }

算法中十進制0和字符0 差48,在轉換的過程中要加上48.

字母A 爲65,比十大55,如下圖所示:

測試結果:

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

 

2.楊輝三角問題

我們觀察可知,該三角除了每一行的第一個元素和最後一個元素是1,其他元素的值是上一行與之相鄰的兩個元素之和。

算法思路:首先將要打印的數據依次進隊,然後在打印每行除兩端數據時,依據出隊元素計算得出。

 Queue<int> que = new Queue<int>();
            int left=0, right = 0;
            Console.Write("請輸入行數");
            int n = int.Parse(Console.ReadLine());
            for (int i = 0; i < n; i++)
            {
                for (int j = 1; j < n - i; j++) 
                {
                    //輸出各行的空格數
                    Console.Write("  ");
                }
                //每行有i+1 個元素
                for (int k = 0; k <= i; k++) 
                {
                    int num = 1;
                    if (k != i) 
                    {
                        right = (int)que.Dequeue();
                        if (k != 0) 
                        {
                            num = left + right;
                        }
                        left = right;
                    }
                    //右對齊,四個長度
                    Console.Write(string.Format("{0,-4}", num.ToString()));
                    que.Enqueue(num);
                }
                Console.WriteLine();
            }

 

3.迴文判斷,正讀和反讀都相同的字符序列,如abba,abcba。設計一個算法判斷輸入的字符序列 是否爲迴文。

思路:利用隊列和棧的特性,一個是先進先出,一個是先進後出

 Console.Write("請輸入一個字符序列:");
            string str = Console.ReadLine();
            Queue<char> Que = new Queue<char>();
            Stack<char> Sta = new Stack<char>();
            for (int i = 0; i < str.Length; i++)
            {
                Que.Enqueue(str[i]);
                Sta.Push(str[i]);
            }
            if (str.Length > 1) 
            {
                if (Que.Dequeue()==Sta.Pop())
                {
                    Console.WriteLine("您輸入的是迴文");
                }
                else
                {
                    Console.WriteLine("您輸入的不是迴文");
                }
            }
            else
            {
                Console.WriteLine("請正確輸入...");
            }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章