堆疊的介紹
棧是一種特殊的線性表,特點是:是一種後進先出的線性表,只能在棧頂對資料進行插入,刪除和取元素等操作。一種比較形象的記憶法是假如你面前有一摞盤子,而最方便和約定俗成的方法是取最上面的盤子,新增盤子時也是把它放在最上面,而對於棧來說是必須要這麼做的。
用陣列實現的乙個簡單的棧 seqstack.h
//順序棧的操作實現
#include"stdio.h"
#include"stdlib.h"
#define maxstacksize 20
typedef char datatype;
//結點的定義
typedef struct
seqstack;
//操作的定義
void initiate(seqstack *s)
int stackempty(seqstack *s)
//入棧
int stackpush(seqstack *s,datatype x)
else
return 0;
}//出棧
void stackpop(seqstack *s,datatype *x)
else }
void stacktop(seqstack *s,datatype *d)
else
}
棧的應用 之一 進行括號匹配
這裡的括號所舉的例子是圓括號,中括號和花括號。
演算法描述:順序掃瞄要判斷的字串,當遇到左括號時,將字串入棧。當掃瞄到右括號時,比較當前棧頂的括號和掃瞄到的右括號是否匹配,如匹配,將此時棧頂的元素退棧,繼續掃瞄字串,若當前的元素和棧頂的元素不匹配時,則匹配次序不成功,若字串為某種型別的右括號,而棧已空,則說明,右括號多於左括號匹配不成功,若掃瞄結束後,棧不為空,則說明左括號多於右括號,匹配不成功。否則,匹配成功。
功能函式 int matbrackets(char *a,int n)
int matchbrackets(char *a,int n)
else
if(a[i]==')')
}if(a[i]=='}')
}if(a[i]==']')}}
} //當遍歷完了之後,出現的情況 有出現一些括號,然後棧為空。
if(stackempty(&s))
else
}
將中綴表示式轉換為字尾表示式
表示式的組成,分為運算元,運算子和分界符。例如表示式a+(b-c/d)*e中,a,b,c,d,e是運算元,+-/*是運算子,()括號是分界符,將之變為字尾表示式的結果是abcd/-e*+,
將中綴表示式轉化為字尾表示式的演算法是:
(1)初始化乙個堆疊,初始化時將棧頂的元素置為#
(2)順序讀入中綴表示式,當讀到運算元時,將其作為字尾表示式的一部分進行輸出
(3)當讀到運算子時,取出棧頂的元素a,此時掃瞄到的元素為b,比較a和b之間的優先順序,若a的優先順序要高於b的優先順序,則將a出棧,作為字尾表示式的一部分進行輸出,再取出棧頂的元素,與b進行比較,若新的棧頂元素a的還是大於b的優先順序,則與上一步操作一樣,若a的優先順序要低於b的優先順序,則將b進行入棧,在去讀取字串的下乙個元素,若a的優先順序等於b的優先順序且a
為(,b為),此時僅僅將a進行出棧操作,讀取下乙個元素,若a的優先順序等於b的優先順序,a為#,b為#,轉換完成。
int compare(char a1,char a2)
char* postexp(char *a,int n)
else
}if(m<0)
if(m==0&&k=='('&&a[i]==')')
if(m==0&&a[i]=='#'&&k=='#')
}} b[j]='\0';
for(i=0;b[i]!='\0';i++)
printf("%c ",b[i]);
return b;
}
//用於測試的主函式 test.c
void main()
";
char b="(()))abc";
char c="(()()abc";
char d="(())abc";
char e="3+(4-4/2)*7#";
char g="(1+2)*3-(4-5)*6-7#";
char *f;
int i;
int n1=strlen(a);
int n2=strlen(b);
int n3=strlen(c);
int n4=strlen(d);
int n5=strlen(g);
int n6=strlen(e);
matchbrackets(a,n1);
matchbrackets(b,n2);
matchbrackets(c,n3);
matchbrackets(d,n4);
f=postexp(g,n5);
f=postexp(e,n6);
}
以上是我學習資料結構的一些筆記,大部分是按照資料結構(朱戰立版)書上的描述,自己去動手實現的。寫下來,與大家一起學習,同時自己也便於自己以後參考。 中綴表示式轉換為字尾表示式
今天我們課前談一談,要說點什麼好呢?最近小甲魚發現,很多魚油在學習資料結構和演算法的時候積極性已經開始有點下降了。甚至很多朋友懷疑資料結構和演算法到底有沒有用?實話說,在大廈的防震設計 消除疾病 防止水源枯竭這些實際問題中,很遺憾,資料結構和演算法幾乎起不到任何直接作用。那為什麼我們要學呢?很簡單,...
中綴表示式轉換為字尾表示式
字尾表示式也叫逆波蘭表示式,其求值過程可以用到棧來輔助儲存。假定待求值的字尾表示式為 6 5 2 3 8 3 則其求值過程如下 1 遍歷表示式,遇到的數字首先放入棧中,此時棧如下所示 2 接著讀到 則彈出3和2,執行3 2,計算結果等於5,並將5壓入到棧中。3 讀到8,將其直接放入棧中。4 讀到 彈...
中綴表示式轉換為字尾表示式
字尾表示式也叫逆波蘭表示式,其求值過程可以用到棧來輔助儲存。假定待求值的字尾表示式為 6 5 2 3 8 3 則其求值過程如下 1 遍歷表示式,遇到的數字首先放入棧中,此時棧如下所示 2 接著讀到 則彈出3和2,執行3 2,計算結果等於5,並將5壓入到棧中。3 讀到8,將其直接放入棧中。4 讀到 彈...