數據結構之自建算法庫——鏈棧

http://blog.csdn.net/sxhelijian/article/details/48463801

本文針對數據結構基礎系列網絡課程(3):棧和隊列中第4課時棧的鏈式存儲結構及其基本運算實現。

按照“0207將算法變程序”[視頻]部分建議的方法,建設自己的專業基礎設施算法庫。

鏈棧算法庫采用程序的多文件組織形式,包括兩個文件:?
  ?
  1.頭文件:listack.h,包含定義鏈棧數據結構的代碼、宏定義、要實現算法的函數的聲明;

#ifndef LISTACK_H_INCLUDED
#define LISTACK_H_INCLUDEDtypedef char ElemType;
typedef struct linknode
{ElemType data;              //數據域struct linknode *next;      //指針域
} LiStack;                      //鏈棧類型定義void InitStack(LiStack *&s);  //初始化棧
void DestroyStack(LiStack *&s);  //銷毀棧
int StackLength(LiStack *s);  //返回棧長度
bool StackEmpty(LiStack *s);  //判斷棧是否為空
void Push(LiStack *&s,ElemType e);  //入棧
bool Pop(LiStack *&s,ElemType &e);  //出棧
bool GetTop(LiStack *s,ElemType &e);  //取棧頂元素
void DispStack(LiStack *s);  //輸出棧中元素#endif // LISTACK_H_INCLUDED
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

  2.源文件:listack.cpp,包含實現各種算法的函數的定義

#include <stdio.h>
#include <malloc.h>
#include "listack.h"void InitStack(LiStack *&s)  //初始化棧
{s=(LiStack *)malloc(sizeof(LiStack));s->next=NULL;
}void DestroyStack(LiStack *&s)  //銷毀棧
{LiStack *p=s->next;while (p!=NULL){free(s);s=p;p=p->next;}free(s);    //s指向尾結點,釋放其空間
}int StackLength(LiStack *s)  //返回棧長度
{int i=0;LiStack *p;p=s->next;while (p!=NULL){i++;p=p->next;}return(i);
}bool StackEmpty(LiStack *s)  //判斷棧是否為空
{return(s->next==NULL);
}void Push(LiStack *&s,ElemType e)  //入棧
{LiStack *p;p=(LiStack *)malloc(sizeof(LiStack));p->data=e;              //新建元素e對應的節點*pp->next=s->next;        //插入*p節點作為開始節點s->next=p;
}bool Pop(LiStack *&s,ElemType &e)  //出棧
{LiStack *p;if (s->next==NULL)      //棧空的情況return false;p=s->next;              //p指向開始節點e=p->data;s->next=p->next;        //刪除*p節點free(p);                //釋放*p節點return true;
}bool GetTop(LiStack *s,ElemType &e)  //取棧頂元素
{if (s->next==NULL)      //棧空的情況return false;e=s->next->data;return true;
}void DispStack(LiStack *s)  //輸出棧中元素
{LiStack *p=s->next;while (p!=NULL){printf("%c ",p->data);p=p->next;}printf("\n");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80

  3.在同一項目(project)中建立一個源文件(如main.cpp),編制main函數,完成相關的測試工作。 例:

#include <stdio.h>
#include "listack.h"int main()
{ElemType e;LiStack *s;printf("(1)初始化鏈棧s\n");InitStack(s);printf("(2)鏈棧為%s\n",(StackEmpty(s)?"空":"非空"));printf("(3)依次進鏈棧元素a,b,c,d,e\n");Push(s,'a');Push(s,'b');Push(s,'c');Push(s,'d');Push(s,'e');printf("(4)鏈棧為%s\n",(StackEmpty(s)?"空":"非空"));printf("(5)鏈棧長度:%d\n",StackLength(s));printf("(6)從鏈棧頂到鏈棧底元素:");DispStack(s);printf("(7)出鏈棧序列:");while (!StackEmpty(s)){   Pop(s,e);printf("%c ",e);}printf("\n");printf("(8)鏈棧為%s\n",(StackEmpty(s)?"空":"非空"));printf("(9)釋放鏈棧\n");DestroyStack(s);return 0;
}


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/383771.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383771.shtml
英文地址,請注明出處:http://en.pswp.cn/news/383771.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java類名與包名不區分大小寫

剛才寫了一個簡單的Java程序&#xff0c;經過測試得到一個令人震驚的結論&#xff1a;Java類名和包名是不區分大小寫的 可以看一下這個例子&#xff1a; package Test;class aBcdEfG {}class AbCdefg {}public class TTT {public static void main(String[] args){AbCdefg tm…

epoll實現高并發聊天室

http://blog.csdn.net/qq_31564375/article/details/51581038項目介紹 本項目是實現一個簡單的聊天室&#xff0c;聊天室分為服務端和客戶端。本項目將很多復雜的功能都去掉了&#xff0c;線程池、多線程編程、超時重傳、確認收包等等都不會涉及。總共300多行代碼&#xff0c;讓…

BZOJ2809-左偏樹合并

Description 在一個忍者的幫派里&#xff0c;一些忍者們被選中派遣給顧客&#xff0c;然后依據自己的工作獲取報償。在這個幫派里&#xff0c;有一名忍者被稱之為 Master。除了 Master以外&#xff0c;每名忍者都有且僅有一個上級。為保密&#xff0c;同時增強忍者們的領導力&a…

處理大并發之一 對epoll的理解,epoll客戶端服務端代碼

http://blog.csdn.net/zhuxiaoping54532/article/details/56494313處理大并發之一對epoll的理解&#xff0c;epoll客戶端服務端代碼序言&#xff1a;該博客是一系列的博客&#xff0c;首先從最基礎的epoll說起&#xff0c;然后研究libevent源碼及使用方法&#xff0c;最后研究n…

epoll詳解

http://blog.csdn.net/majianfei1023/article/details/45772269歡迎轉載&#xff0c;轉載請注明原文地址&#xff1a;http://blog.csdn.net/majianfei1023/article/details/45772269一.基本概念&#xff1a;1.epoll是什么&#xff1a;epoll是Linux內核為處理大批量文件描述符而…

數據分割-并查集+set

小w來到百度之星的賽場上&#xff0c;準備開始實現一個程序自動分析系統。 這個程序接受一些形如xixj 或 xi≠xj 的相等/不等約束條件作為輸入&#xff0c;判定是否可以通過給每個 w 賦適當的值&#xff0c;來滿足這些條件。 輸入包含多組數據。 然而粗心的小w不幸地把每組數據…

linux c++線程池的實現

http://blog.csdn.net/zhoubl668/article/details/8927090?t1473221020107 線程池的原理大家都知道&#xff0c;直接上代碼了^_^ Thread.h [cpp] view plaincopy #ifndef __THREAD_H #define __THREAD_H #include <vector> #include <string> #inc…

樹啟發式合并入門

所謂啟發式合并&#xff0c;就是一種符合直覺的合并方法&#xff1a;將小的子樹合并在大的子樹上。 這些問題一般是相似的問題背景&#xff1a;都是樹上的計數問題&#xff0c;都不能直接從上往下進行暴力&#xff0c;都需要從下往上計數時對子樹信息進行運算從而得到父親節點的…

鏈棧基本操作

http://blog.csdn.net/jwentao01/article/details/46765517###;棧基本概念&#xff1a; 棧&#xff08;stack&#xff09;是限定在表尾進行插入和刪除操作的線性表&#xff08;或單鏈表&#xff09;。 //只能在一段進行插入和刪除&#xff0c;因此不存在&#xff0c;在中間進行…

Linux網絡編程---I/O復用模型之select

https://blog.csdn.net/men_wen/article/details/53456435Linux網絡編程—I/O復用模型之select 1. IO復用模型 IO復用能夠預先告知內核&#xff0c;一旦發現進程指定的一個或者多個IO條件就緒&#xff0c;它就通知進程。IO復用阻塞在select或poll系統調用上&#xff0c;而不是阻…

UVa12633-Super Rooks on Chessboard-容斥+FFT

題目大意就是給你一個R*C的棋盤&#xff0c;上面有超級兵&#xff0c;這種超級兵會攻擊 同一行、同一列、同一主對角線的所有元素&#xff0c;現在給你N個超級兵的坐標&#xff0c;需要你求出有多少方塊是不能被攻擊到的(R,C,N<50000) 遇到這種計數問題就要聯想到容斥&#…

Linux網絡編程---I/O復用模型之poll

https://blog.csdn.net/men_wen/article/details/53456474Linux網絡編程—I/O復用模型之poll 1.函數poll poll系統調用和select類似&#xff0c;也是在指定時間內輪詢一定數量的文件描述符&#xff0c;以測試其中是否有就緒者。 #include <poll.h>int poll(struct pollfd…

FFT模板

整理了一下&#xff0c;自己寫了一下模板 const double PIacos(-1.0); struct complex {double r,i;complex(double _r0,double _i0):r(_r),i(_i){}complex operator (const complex &b) {return complex(rb.r,ib.i);}complex operator -(const complex &b) {return c…

Linux網絡編程---I/O復用模型之epoll

https://blog.csdn.net/men_wen/article/details/53456474 Linux網絡編程—I/O復用模型之epoll 1. epoll模型簡介 epoll是Linux多路服用IO接口select/poll的加強版&#xff0c;e對應的英文單詞就是enhancement&#xff0c;中文翻譯為增強&#xff0c;加強&#xff0c;提高&…

POJ 1741tree-點分治入門

學習了一下點分治&#xff0c;如果理解有誤還請不吝賜教。 為了快速求得樹上任意兩點之間距離滿足某種關系的點對數&#xff0c;我們需要用到這種算法。 點分治是樹上的一種分治算法&#xff0c;依靠樹和子樹之間的關系進行分治從而降低復雜度。 和其他樹上的算法有一些區別…

基于單鏈表的生產者消費者問題

『生產者與消費者問題分析』「原理」生產者生產產品&#xff0c;消費者消費產品。產品如果被消費者消費完了&#xff0c;同時生產者又沒有生產出產品&#xff0c;消費者 就必須等待。同樣的&#xff0c;如果生產者生產了產品&#xff0c;而消費者沒有去消費&#x…

C++智能指針(一)智能指針的簡單介紹

https://blog.csdn.net/nou_camp/article/details/70176949C智能指針 在正式了解智能指針前先看一下下面的一段代碼 #include<iostream> using namespace std; class A { public:A():_ptr(NULL), _a(0){}~A(){} public:int* _ptr;int _a; };void test() {A a;int *p1 ne…

聰聰可可-點分治

聰聰和可可是兄弟倆&#xff0c;他們倆經常為了一些瑣事打起來&#xff0c;例如家中只剩下最后一根冰棍而兩人都想吃、兩個人都想玩兒電腦&#xff08;可是他們家只有一臺電腦&#xff09;……遇到這種問題&#xff0c;一般情況下石頭剪刀布就好了&#xff0c;可是他們已經玩兒…

C++智能指針(二)模擬實現三種智能指針

https://blog.csdn.net/nou_camp/article/details/70186721在上一篇博客中提到了Auto_ptr(C智能指針&#xff08;一&#xff09;)&#xff0c;下面進行模擬實現Auto_ptr 采用類模板實現 #include<iostream> using namespace std; template<class T> class Autoptr …

Prime Distance On Tree-樹分治+FFT

題目描述 Problem description. You are given a tree. If we select 2 distinct nodes uniformly at random, what’s the probability that the distance between these 2 nodes is a prime number? Input The first line contains a number N: the number of nodes in this…