棧是一種先進後出的資料結構,這個我相信大家很好理解。那下面我就通過兩個棧的實際應用來幫助大家更好的理解棧的工作狀態。
十進位制數n和其他d進製數的轉換是計算機實現計算的基本問題,其解決方法很多,其中乙個簡單演算法基於下列原理:例如:(n = ( n div d ) * d + n mod d (其中,div為整除運算,mod為求餘運算)
1348)10
\ (1348)_
(1348)
10 = (
2504)8
\ (2504)_
(2504)
8nn div 8
n mod 8
1348
1684
16821021
2520
2
下面看c**,這裡是順序棧
#include
#include
typedef
struct stack
stack,
*pstack;
stack s=
;//結構體的宣告
//棧的初始化
void
initstack()
s.top = s.base;
printf
("棧初始化成功!!\n");
}//push函式,接受兩個引數,要往哪個棧中壓入哪個值
void
push
(pstack s,
int value)
*(s-
>top)
= value;
s->top--;}
//pop函式,返回棧頂的資料
intpop
(pstack s)
s->top++
; tmp =
*(s-
>top)
;return tmp;
}//判斷棧是否為空
intstackempty
(pstack s)
//數制轉換函式
void
convert
(int num,
int scale)
}void
main()
printf
("\n");
}
接下來是鏈棧
#include
#include
typedef
struct stacknode
stacknode,
*pstacknode;
//棧底,棧頂方向標
typedef
struct stack
stack,
*pstack;
int num =
1314
;int scale =2;
//初始化乙個stack的例項,填充0
stack s =
;//指標指向stack例項
pstack ps =
&s;//建立頭指標
pstacknode stacknodeinit()
//每次push,呼叫一次
pstacknode creatlist
(pstack s)
void
stackinit
(pstacknode p)
//接受乙個引數,型別為pstacknode
void
push
(pstack s,
int value)
//出棧,返回棧頂的資料
intpop
(pstack s)
s->top = s-
>top-
>next;
value = s-
>top-
>data;
free
(p);
return value;
}int
stackempty
(pstack s)
void
convert
(pstack s,
int num,
int scale)
}void
output
(pstack s)
printf
("\n");
}void
init()
void
main()
假設表示式中允許包含兩種括號,圓括號和方括號,其巢狀的順序隨意,即( [ ] ( ) )或者[ ( [ ] [ ] ) ]等為正確的格式,[ ( ] )或( [ ( ) ) 或 ( ( ) ])均為不正確的格式。檢驗括號是否匹配的正確方法可以用「期待的急迫程度」這個概念來描述。
例如考慮以下括號序列:如果從左括號的角度看這個問題,太複雜。我們可以看右括號。[ ( [ ] [ ] ) ]
12345678
當計算機接受了第乙個括號後,它期待著與其匹配的第八個括號的出現,然而等來的確實第二個括號,此時第乙個括號「[」只能暫時靠邊,而迫切等待與第二個括號相匹配的、第七個括號「)」的出現。以此類推。
仔細考慮一下,如果我們遇到乙個左括號就入棧,然後遇到了乙個右括號,那麼棧頂的資料一定是與這個右括號相匹配的。如果不匹配,那就說明這個字串有問題。
思路出來了。
遇到左括號就入棧,遇到右括號就與棧頂的資料匹配
看c**,順序棧的實現
#include
#include
#include
#define max 100
typedef
struct stack
stack,
*pstack;
//定義乙個struct satck變數
stack s=
;//獲得s的指標
pstack ps =
&s;void
stackinit
(pstack ps)
ps->base = addr;
ps->top = ps-
>base;
}void
push
(pstack ps,
char ch)
void
pop(pstack ps)
char
gettop
(pstack ps)
char
reverse
(char c)';
if(c ==
'[')
return
']';
else
return0;
}void
check
(char
*str,
int length,pstack ps)
'|| str[i]
==']')}
}printf
("您輸入的字串沒有問題!\n");
}void
main()
;//棧的初始化
stackinit
(ps)
;printf
("please input the string you want to check:");
scanf
("%s"
,string)
; length =
strlen
(string)
;check
(string,length,ps)
;printf
("\n");
}
鏈棧的實際應用(總結)
1 表示式求值在計算機中進行算術表示式的計算是通過棧來實現的。1 算術表示式的三種表示 中綴 雙目運算子出現在兩個運算元中間,例 a b 字首 雙目運算子出現在兩個運算元前面,例 ab 字尾 雙目運算子出現在兩個運算元後面,例 ab 2 三種表示式之間的轉換 按運算的優先次序全部加上括號,逐個括號寫...
棧和佇列的實際應用 小貓釣魚
include include include struct queue struct stack int main else book s.data s.top 0 q1.data q1.tail s.data s.top 先判斷一下小哈手中的牌,如果此時小哈手中已無牌,遊戲結束 if q1.he...
棧的實際應用 四則運算
四則運算 計算機在進行運算過程會先將中綴轉成字尾進行計算。中綴表示式 9 6 3 8 4 字尾表示式 96 3 84 中綴轉字尾規則 借助輔助棧,遇到數字或字母,列印 遇到符號,將當前符號與棧頂符號進行優先順序比較。如果當前符號優先順序高,則直接入棧,如果當前符號優先順序較低,則將棧頂元素依次出棧,...