堆棧(順序存儲(chǔ))數(shù)組方式
typedef struct{
int Data[MAXSIZE];
int Top;
}Stack;
void Push(Stack *stack,int value){
if(stack->Top==MAXSIZE-1){//數(shù)組有界
printf("堆棧滿");
}else{
stack->Data[++(stack->Top)]=value;
return;
}
}
int Pop(Stack *stack){
if(stack->Top==-1){//為空檢查
printf("堆棧為空");
return ERROR;
} else
return stack->Data[stack->Top--];
}
一個(gè)有界數(shù)組存儲(chǔ)兩個(gè)堆棧
#define MAXSIZE 50
/*一個(gè)有界數(shù)組存儲(chǔ)兩個(gè)堆棧叛溢,如果數(shù)組有空間則執(zhí)行入棧操作,(一個(gè)向右增長枪向,一個(gè)向左增長)
* */
typedef struct DStack{
int data[MAXSIZE];
int Top1;
int Top2;
}Stacks;
void Push(Stacks *stacks,int value,int Tag){
if(stacks->Top2-stacks->Top1==1){
printf("堆棧滿");return;
}
if(Tag==1)
stacks->data[++stacks->Top1]=value;
else
stacks->data[--stacks->Top2]=value;
}
int Pop(Stacks *stacks,int Tag){
if(Tag==1){
if(stacks->Top1==-1){
printf("堆棧1空");
return NULL;
}else {
return stacks->data[stacks->Top1--];
}
}else{
if(stacks->Top2==MAXSIZE){
printf("堆棧2空");
return NULL;
}else{
return stacks->data[stacks->Top2++];
}
}
}
int main() {
Stacks *stacks;
stacks->Top1=-1;
stacks->Top2=MAXSIZE;//初始化兩個(gè)堆棧頭指針
return 0;
}
堆棧(鏈?zhǔn)酱鎯?chǔ))
/*用單向鏈表表示棧時(shí)候,棧Top結(jié)點(diǎn)一定是鏈頭結(jié)點(diǎn)
* */
typedef struct Node{
int value;
struct Node *next;
}LinkedStack;
LinkedStack * CreateLinkedStack(){
LinkedStack *stack;
stack=(LinkedStack *)malloc(sizeof(LinkedStack));
stack->next=NULL;
return stack;
};
int isEmpty(LinkedStack *stack){//注意Top結(jié)點(diǎn)沒有值卿泽,只有一個(gè)單鏈表的頭指針
return (stack->next==NULL);
}
void Push(LinkedStack *stack,int value){
LinkedStack *insertElement;
insertElement=malloc(sizeof(LinkedStack));//分配內(nèi)存空間
insertElement->value=value;//插入的值賦值給結(jié)點(diǎn)
insertElement->next=stack->next;//將已存在鏈表鏈接到插入的結(jié)點(diǎn)
stack->next=insertElement;//改變Top結(jié)點(diǎn)
}
int Pop(LinkedStack *stack){
int result;
LinkedStack *popElement;
if(isEmpty(stack)){
printf("鏈表為空");
return ERROR;
}else{
popElement=stack->next;
result=popElement->value;
stack->next=popElement->next;
free(popElement);//記得釋放無用內(nèi)存空間
return result;
}
}
中綴表達(dá)式如何轉(zhuǎn)換為后綴表達(dá)式
從頭到尾讀取中綴表達(dá)式的每一個(gè)對(duì)象
1.運(yùn)算數(shù):直接輸出
2.左括號(hào):壓入堆棧
3.右括號(hào):將棧頂?shù)倪\(yùn)算符彈出并輸出,直到遇到左括號(hào)(出棧不輸出)
4.運(yùn)算符:
若優(yōu)先級(jí)大于棧頂運(yùn)算符榄审,則壓棧
若優(yōu)先級(jí)小于等于棧頂運(yùn)算符驳概,將棧頂運(yùn)算符彈出,
再比較新的棧頂運(yùn)算符旅薄,直到改運(yùn)算符大于棧頂運(yùn)算符優(yōu)先級(jí)為止辅髓,然后壓棧5.若個(gè)對(duì)象處理完畢,則把堆棧中存留的運(yùn)算符一并輸出
堆棧用途:
- 函數(shù)調(diào)用及遞歸實(shí)現(xiàn)
- 深度優(yōu)先搜索
- 回溯算法