初級資料結構
參考《挑戰程式設計競賽2》
初級資料結構包括棧(stack)、佇列(queue)、表(list)
棧
棧中最重要的是指向棧頂的指標top
// S[1000]是棧,top是指向棧頂的指標
int top,S[1000];
// push入棧
void push(int x){
S[++top] = x;
}
// pop出棧
int pop(){
return s[top--];
}
佇列
佇列中最重要的是指向隊頭的指標head和隊尾的指標tail
// 結構體定義形式要記住
typedef struct pp{
char name[100];
int t;
}P;
// Q[LEN]為佇列
P Q[LEN];
// head,tail分別為頭指標和尾指標,n為佇列長度
// tail指向最後一個元素的後一位,head指向第一個元素
int head,tail,n;
void enqueue(){
Q[tail] = x;
tail = (tail + 1) % LEN;
}
P dequeue(){
P x = Q[head];
head = (head + 1)%LEN;
return x;
}
連結串列
其實畫圖明瞭之後就很容易寫出來
//雙向連結串列,prev指向前一個元素,next指向下一個元素
typedef struct Node{
int key;
Node *prev, *next;
}Node;
// nil是指向頭結點的指標
// 頭結點不包含任何資料
Node *nil;
void init(){
nil = (Node*)malloc(sizeof(Node));
nil->next = nil;
nil->prev = nil;
}
void insertNode(int key){
Node *x = (Node*)malloc(sizeof(Node));
x->key = key;
// 在頭節點後新增元素
x->next = nil->next;
nil->next->prev = x;
nil->next = x;
x->prev = nil;
}
Node* listSearch(int key){
Node *cur = nil->next;
// cur==nil的時候,搜尋完畢了
while( cur!= nil&&cur->key != key){
cur = cur->next;
}
return cur;
}
void deleteNode(Node *t){
if(t == nil) return; //t為頭結點時不做處理
t->prev->next = t->next;
t->next->prev = t->prev;
free(t);
}
void deleteFirst(){
deleteNode(nil->next);
}
void deletLast(){
deleteNode(nil->prev);
}
void deleteKey(int key){
deleteNode(listSearch(key));
}
C++標準庫STL
stack、queue、vector、list
vector是動態陣列
在訪問vector中的元素(賦值或寫入)時,可以與陣列一樣使用"[ ]“運算子
list既可以像vector一樣通過”[ ]"運算子直接訪問特定元素,也可以用迭代器訪問;
list還具備一項vector所不具備的特長,就是元素的插入與刪除操作,只需要O(1)即可完成,效率極高;
stack<int>S;
vector<int> V;
list<pair<int,int>> L;
//使用迭代器如下所示
list<int>::iterator it = L.begin();
其他可直接參考C/C++ API
通過下面的應用可以瞭解stack,pair,make_pair的用法
#include <iostream>
#include <stack>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
stack<int> S1;
// C++中使用pair來表示結構化的一組值
stack<pair<int,int>> S2;
char ch;
int sum = 0;
for(int i = 0; cin >> ch;i++){
if(ch =='\\'){
S1.push(i);
}
else if(ch == '/' && S2.size() > 0){
int j = S1.top();
S1.pop();
sum += i - j;
int a = i - j;
while(S2.size() > 0 && S2.top().first > j){
a += S2.top().second;
S2.pop();
}
S2.push(make_pair(j,a));
}
}
vector<int> ans;
while(S2.size() > 0){
ans.push_back(S2.top().second);
S2.pop();
}
reverse(ans.begin(),ans.end());
cout << sum << endl;
cout << ans.size();
for(int i = 0;i < ans.size();i++){
cout << " ";
cout << ans[i];
}
cout << endl;
return 0;
}
相關文章
- 資料結構(初級)資料結構
- 資料結構初識資料結構
- mysql innodb體系結構--初級MySql
- 資料結構:初識(資料結構、演算法與演算法分析)資料結構演算法
- 山鬼的資料結構坑(初篇)資料結構
- 初識Oracle資料庫體系結構Oracle資料庫
- 初學資料結構--《資料結構》人民郵電出版社 2.1-2.2資料結構
- FHQ Treap小結(神級資料結構!)資料結構
- 資料結構初階--堆排序+TOPK問題資料結構排序TopK
- 資料結構之堆:初學只需一文資料結構
- zt_data block資料塊之物理結構初識BloC
- 結構化資料、半結構化資料和非結構化資料
- shell初級-----資料呈現方式
- 【資料結構篇】認識資料結構資料結構
- 資料庫知識整理 - 概述、資料模型、三級模式結構資料庫模型模式
- [譯文] 初學者應該瞭解的資料結構: Tree資料結構
- [譯文] 初學者應該瞭解的資料結構: Graph資料結構
- 資料結構小白系列之資料結構概述資料結構
- 資料結構?資料結構
- 資料結構資料結構
- 初識makefile結構
- 資料結構與演算法-資料結構(棧)資料結構演算法
- 【資料結構與演算法】二分鐘初識樹資料結構演算法
- 資料結構初階--單連結串列(講解+類别範本實現)資料結構
- 資料結構初階--二叉樹介紹(基本性質+堆實現順序結構)資料結構二叉樹
- 【PHP資料結構】PHP資料結構及演算法總結PHP資料結構演算法
- 資料結構-棧資料結構
- 資料結構-堆資料結構
- 資料結構-集合資料結構
- 資料結構 - 字串資料結構字串
- 資料結構——列表資料結構
- Redis 資料結構Redis資料結構
- 資料結構——樹資料結構
- Redis資料結構Redis資料結構
- 資料結構-樹資料結構
- Java資料結構Java資料結構
- 資料結構---串資料結構
- 資料結構|前言資料結構