各種基本演算法實現小結(二)—— 堆 棧
(均已測試通過)
==============================================================
棧——數組實現
測試環境:Win - TC
#include <stdio.h><br />char stack[512];<br />int top=0;<br />void push(char c)<br />{<br /> stack[top]=c;<br /> top++;<br />}<br />char pop()<br />{<br /> top--;<br /> return stack[top];<br />}<br />int is_empty()<br />{<br /> return 0==top;<br />}<br />void main()<br />{<br /> push('1');<br /> push('2');<br /> push('3');<br /> push('4');<br /> push('5');<br /> while(!is_empty())<br /> putchar(pop());<br /> putchar('/n');<br /> getch();<br />}
運行結果:
====================================================
棧——數組實現2
測試環境:Win - TC
#include <stdio.h><br />#include <malloc.h><br />/* typedef int DataType; */<br />#define DataType int<br />#define MAX 1024<br />typedef struct<br />{<br /> DataType data[MAX];<br /> int top;<br />}stack, *pstack;<br />pstack *init_stack()<br />{<br /> pstack ps;<br /> ps=(pstack)malloc(sizeof(stack));<br /> if(!ps)<br /> {<br /> printf("Error. fail malloc.../n");<br /> return NULL;<br /> }<br /> ps->top=-1;<br /> return ps;<br />}<br />int empty_stack(pstack ps)<br />{<br /> if(-1 == ps->top)<br /> return 1;<br /> else<br /> return 0;<br />}<br />int push(pstack ps, DataType data)<br />{<br /> if(ps->top == MAX-1)<br /> {<br /> printf("Stack is full.../n");<br /> return 0;<br /> }<br /> ps->top++;<br /> ps->data[ps->top]=data;<br /> return 1;<br />}<br />int pop(pstack ps, DataType *data)<br />{<br /> if(empty_stack(ps))<br /> {<br /> printf("Stack is empty.../n");<br /> return 0;<br /> }<br /> *data=ps->data[ps->top];<br /> ps->top--;<br /> return 1;<br />}<br />DataType top_stack(pstack ps)<br />{<br /> if(empty_stack(ps))<br /> {<br /> printf("Stack is empty.../n");<br /> return 0;<br /> }<br /> return ps->data[ps->top];<br />}<br />void display(pstack ps)<br />{<br /> int i;<br /> if(empty_stack(ps))<br /> {<br /> printf("Stack is empty.../n");<br /> return;<br /> }<br /> printf("printf the items of stack.../n");<br /> for(i=ps->top;i>-1;i--)<br /> printf("%4d", ps->data[i]);<br /> printf("/n/n");<br />}<br />void main()<br />{<br /> int i, num, data, *pdata;<br /> pstack ps;<br /> ps=init_stack();<br /> printf("Enter stack num:");<br /> scanf("%d", &num);<br /> for(i=0;i<num;i++)<br /> {<br /> scanf("%d", &data);<br /> push(ps, data);<br /> }<br /> display(ps);<br /> printf("Top is %d/n/n", top_stack(ps));<br /> for(i=0;i<num;i++)<br /> {<br /> pop(ps, pdata);<br /> printf("%3d", *pdata);<br /> }<br /> printf("/n/n");<br /> display(ps);<br /> getch();<br />}<br />
運行結果:
====================================================
棧——鏈表實現
測試環境:Win - TC
#include <stdio.h><br />#include <malloc.h><br />typedef char DataType;<br />struct _node<br />{<br /> DataType data;<br /> struct _node *next;<br />};<br />typedef struct _node node, *pstack;<br />pstack init_stack()<br />{<br /> pstack ps;<br /> ps=(pstack)malloc(sizeof(node));<br /> if(NULL == ps)<br /> {<br /> printf("Error. malloc is fail.../n");<br /> return NULL;<br /> }<br /> ps->data=-1; /* base of stack: data=-1 and next=NULL */<br /> ps->next=NULL;<br /> return ps;<br />}<br />pstack push(pstack ps, DataType data)<br />{<br /> pstack ptop;<br /> ptop=(pstack)malloc(sizeof(node));<br /> if(NULL == ptop)<br /> {<br /> printf("Error. malloc is fail.../n");<br /> return NULL;<br /> }<br /> ptop->data=data;<br /> ptop->next=ps; /* insert new item */<br /> ps=ptop; /* move top */<br /> return ps;<br />}<br />pstack pop(pstack ps, DataType *data)<br />{<br /> if(ps->next == NULL)<br /> {<br /> printf("stack is empty.../n");<br /> return NULL;<br /> }<br /> *data=ps->data;<br /> ps=ps->next;<br /> return ps;<br />}<br />DataType top_stack(pstack ps)<br />{<br /> if(ps->next == NULL) /* if empty */<br /> {<br /> printf("stack is empty.../n");<br /> return -1;<br /> }<br /> return ps->data;<br />}<br />int len_stack(pstack ps)<br />{<br /> int len=0;<br /> pstack ptop=ps;<br /> while(ptop->next)<br /> {<br /> len++;<br /> ptop=ptop->next;<br /> }<br /> return len;<br />}<br />void display(pstack ps)<br />{<br /> pstack ptop;<br /> ptop=ps;<br /> while(ptop->next != NULL)<br /> {<br /> printf("%4c", ptop->data);<br /> ptop=ptop->next;<br /> }<br /> printf("/n/n");<br />}<br />void main()<br />{<br /> pstack ps;<br /> DataType *data=(DataType *)malloc(sizeof(DataType));<br /> ps=init_stack();<br /> ps=push(ps, 'a');<br /> ps=push(ps, 'b');<br /> ps=push(ps, 'c');<br /> ps=push(ps, 'd');<br /> ps=push(ps, 'e');<br /> display(ps);<br /> printf("len of stack is: %d/n/n", len_stack(ps));<br /> printf("top of stack is: %c/n/n", top_stack(ps));<br /> ps=pop(ps, data);<br /> printf("pop %c/n",*data);<br /> display(ps);<br /> ps=pop(ps, data);<br /> printf("pop %c/n",*data);<br /> display(ps);<br /> getch();<br />}
運行結果:
========================================================
堆 ——鏈表實現
測試環境:Win - TC
#include <stdio.h><br />#include <malloc.h><br />#include <stdlib.h><br />struct _node<br />{<br /> int data;<br /> struct _node *next;<br />};<br />typedef struct _node node, *pnode;<br />struct _linkqueue<br />{<br /> pnode front;<br /> pnode rear;<br />};<br />typedef struct _linkqueue linkqueue, *plinkqueue;<br />linkqueue init_queue()<br />{<br /> linkqueue lq;<br /> lq.front=lq.rear=(pnode)malloc(sizeof(node));<br /> if(NULL == lq.front)<br /> {<br /> printf("Error. malloc is fail.../n");<br /> exit(1);<br /> }<br /> lq.rear->data=lq.front->data=-1;<br /> lq.rear->next=lq.front->next=NULL;<br /> return lq;<br />}<br />int empty_queue(linkqueue lq)<br />{<br /> if(lq.front == lq.rear)<br /> return 1;<br /> else<br /> return 0;<br />}<br />linkqueue insert_item(linkqueue lq, int data)<br />{<br /> pnode pq;<br /> pq=(pnode)malloc(sizeof(node));<br /> if(pq == NULL)<br /> {<br /> printf("Error. malloc is fail.../n");<br /> exit(1);<br /> }<br /> pq->data=data;<br /> pq->next=lq.rear->next;<br /> lq.rear->next=pq;<br /> lq.rear=lq.rear->next;<br /> return lq;<br />}<br />linkqueue delete_item(linkqueue lq, int *data)<br />{<br /> if(empty_queue(lq))<br /> {<br /> printf("queue is empty.../n");<br /> exit(1);<br /> }<br /> *data=lq.front->data;<br /> lq.front=lq.front->next;<br /> return lq;<br />}<br />int len_queue(linkqueue lq)<br />{<br /> int len=0;<br /> while(lq.front)<br /> {<br /> len++;<br /> lq.front=lq.front->next;<br /> }<br /> return len;<br />}<br />void display(linkqueue lq)<br />{<br /> linkqueue p;<br /> p=lq;<br /> if(empty_queue(lq))<br /> {<br /> printf("queue is empty.../n");<br /> return;<br /> }<br /> while(p.front->next)<br /> {<br /> printf("%4d", p.front->data);<br /> p.front=p.front->next;<br /> }<br /> printf("%4d/n/n", p.front->data);<br />}<br />void main()<br />{<br /> int *data = (int *)malloc(sizeof(int));<br /> linkqueue lq;<br /> lq=init_queue();<br /> lq=insert_item(lq, 1);<br /> lq=insert_item(lq, 2);<br /> lq=insert_item(lq, 3);<br /> lq=insert_item(lq, 4);<br /> lq=insert_item(lq, 5);<br /> display(lq);<br /> printf("len of queue is: %d/n/n", len_queue(lq));<br /> lq=delete_item(lq, data);<br /> printf("delete %d/n", *data);<br /> display(lq);<br /> lq=delete_item(lq, data);<br /> printf("delete %d/n", *data);<br /> display(lq);<br /> getch();<br />}
運行結果:
參考推薦:
學習演算法之路
各種基本演算法實現小結(一)—— 鏈 表
各種基本演算法實現小結(二)—— 堆 棧
各種基本演算法實現小結(三)—— 樹與二叉樹
各種基本演算法實現小結(四)—— 圖及其遍曆
各種基本演算法實現小結(五)—— 排序演算法
各種基本演算法實現小結(六)—— 尋找演算法
各種基本演算法實現小結(七)—— 常用演算法
12個有趣的C語言面試題