昨天剛實現了棧的一些基本操作,今天就來實現一點棧的應用把!
首先,寫一點比較簡單的:
1.逆波蘭表示式的計算。
在通常的表示式中,二元運算子總是置於與之相關的兩個運算物件之間,這種表示法也稱為中綴表示。逆波蘭表示式也稱為字尾表示式。比如:
現在通過乙個程式去計算乙個簡單的字尾表示式:
#pragma once
#include #include #include using namespace std;
enum type
;enum symbol
;struct cell
;int countsymbol(cell a, size_t size)
else
}} return s.top();
}void testsymbol()
, ,
, ,
, ,
, ,
, ,
, };
int ret = countsymbol(a, sizeof(a) / sizeof(a[0]));
cout <
}
在這個程式中可以看到應用了棧的乙個重要特性,「後進先出」。
2.迷宮是乙個很長久的話題,今天我就用**來實現它。
迷宮問題有乙個很重要的點,就是「回溯」,顧名思義,就是沿著走過的路依次往回走。
為了簡單起見,直接寫乙個迷宮,定義為「maze.txt」檔案
(0表示通路,1表示牆)
把走過的路的座標儲存在乙個棧中,當無路可走的時候,從棧中依次pop出的座標回溯,直到找到正確的路或者沒有通路為止!
**實現如下:
#pragma once
#pragma once
#define _crt_secure_no_warnings 1
#define n 10
#include #include #include using namespace std;
struct pos//記錄座標
;void getmaze(int * a, int n)//讀取迷宮
else
}} fclose(fout);
}void printmaze(int * a, int n)//輸出迷宮
cout <
bool checkisaccess(int * a, int n, pos next)//檢查是否通行
else }
bool mazepath(int *a, int n, const pos & entry, stack& path)
//向上
pos next = cur;
next._row--;
if (checkisaccess(a, n, next))//判斷
//向下
next = cur;//每次判斷的時候重新賦值給next
next._row++;
if (checkisaccess(a, n, next))
//向左
next = cur;
next._col--;
if (checkisaccess(a, n, next))
//向右
next = cur;
next._col++;
if (checkisaccess(a, n, next))
//無路可走
a[cur._row*n + cur._col] = 3;
path.pop();
if (!path.empty())
}return false;
}void testmaze()
; getmaze((int *)a, n);
printmaze((int *)a, n);
stackpath;
pos entry = ;
mazepath((int *)a, n, entry, path);
cout <
printmaze((int *)a, n);
}
輸出的結果是:
數字「2」表示通路。
歡迎各位大神吐槽。
本文出自 「不斷進步的空間」 部落格,請務必保留此出處
一些小小體會。。。
接觸sap 與 abap 已經有8個多月了 從當初什麼都不懂的小菜鳥,到如今,可以算是努力擺脫初級,在公升級前的掙扎,最後一段的衝刺。可笑的是,即使擺脫了初級,不再被稱為是菜鳥,離老鳥的尊稱還有很長一段距離。目前為止,浪費了不少時間,在abap 的學習上雖然刻苦認真許多,但是在sap 的相關模組業務...
陣列引用與陣列的一些小小小小研究
首先看這麼一段程式 include using namespace std void test char a 20 char b cout 1204 4可以看到乙個字元型別佔1個位元組,字元陣列佔陣列長度 單個型別所佔位元組,而作為引數時,位元組數為4,與int相同。這裡傳遞的是a 20 陣列的首位...
關於for迴圈的一些小小理解
for 迴圈的語法是 for expr1 expr2 expr3 statement expr1 第乙個表示式 expr1 在迴圈開始前無條件求值 並執行 一次。expr2 第二個表示式在每次迴圈開始前求值。如果值為true,則繼續迴圈,執行巢狀的迴圈語句。如果值為false,則終止迴圈。expr3...