2018 11 26學習記錄

2021-09-01 23:49:54 字數 3709 閱讀 4435

一.共享棧

原理:想要乙個陣列實現兩個棧,那麼就必須乙個棧的棧頂從陣列下標為0處開始,另乙個棧從陣列額最大下標處開始,兩個棧相對而生如下圖所示:

如何判斷棧滿?

當兩個棧頂標記重合時,表示共享棧已經滿了

**如下:

標頭檔案sharestack.h

#pragma once

#include#includetypedef char stacktype;

typedef struct sharestacksharestack;

void sharestackinit(sharestack* stack); //共享棧的初始化

void sharestackdestroy(sharestack* stack); //銷毀共享棧

//對左邊棧進行操作

void leftsharestackpush(sharestack* stack, stacktype value);//入棧

void leftsharestackpop(sharestack* stack); //出棧

int leftsharestacktop(sharestack* stack, stacktype* value); //取棧頂元素

//對右邊棧進行操作

void rightsharestackpush(sharestack* stack, stacktype value); //入棧

void rightsharestackpop(sharestack* stack); //出棧

int rightsharestacktop(sharestack* stack, stacktype* value);//取棧頂元素

標頭檔案的實現sharestack.c:

#include"sharestack.h"

void sharestackinit(sharestack* stack)

stack->max_size = 10;

stack->size_left = 0;

stack->size_right = stack->max_size;

stack->space = malloc(stack->max_size * sizeof(sharestack));

return;}

void sharestackdestroy(sharestack* stack)

stack->max_size = 0;

stack->size_left = 0;

stack->size_right = 0;

free(stack->space);

stack->space = null;}

void leftsharestackpush(sharestack* stack, stacktype value)

if(stack->size_left == stack->size_right)

stack->space[stack->size_left] = value;

stack->size_left++;

return;}

void leftsharestackpop(sharestack* stack)

if(stack->size_left == 0)

stack->size_left--;

return;}

int leftsharestacktop(sharestack* stack, stacktype* value)

if(stack->size_left == 0)

*value = stack->space[stack->size_left - 1];

return 1;}

void rightsharestackpush(sharestack* stack, stacktype value)

if(stack->size_left == stack->size_right)

stack->size_right--;

stack->space[stack->size_right] = value;

return;}

void rightsharestackpop(sharestack* stack)

if(stack->size_left == stack->max_size)

stack->size_right++;

return;}

int rightsharestacktop(sharestack* stack, stacktype* value)

if(stack->size_right == stack->max_size)

*value = stack->space[stack->size_right];

return 1;}

/////以下為測試**

///

void testsharestack()

int main()

二.位址是常量,不能自增所以定義int a[4];a++是非法的;

三.二維陣列與二級指標:

幾個重要公式:a[i]+j == &a[i][j];*(a+i)+j == &a[i][j];

對於int (*p)[n] = a; /*其中n是二維陣列a[m][n]的列數, 是乙個數字, 前面說過, 陣列長度不能定義成變數*/

有*(p+i) + j == &a[i][j];

理解:int(*p)[n]定義了乙個指標p指向int[n];a=a[0]=;

四.原地逆序(陣列比煉表快)

1.陣列(前後交換,只需要迴圈n/2次)

void reverse(char *str)

2.鍊錶

五.陣列和鍊錶的查詢(陣列為何比煉表快?)

1、定址操作次數鍊錶要多一些。陣列只需對 [基位址+元素大小*k] 就能找到第k個元素的位址,對其取位址就能獲得該元素。鍊錶要獲得第k個元素,首先要在其第k-1個元素尋找到其next指標偏移,再將next指標作為位址獲得值,這樣就要從第乙個元素找起,多了多步定址操作,當資料量大且其它操作較少時,這就有差距了。

該回答源自:

2、cpu快取會把一片連續的記憶體空間讀入,因為陣列結構是連續的記憶體位址,所以陣列全部或者部分元素被連續存在cpu快取裡面,平均讀取每個元素的時間只要3個cpu時鐘週期。   而鍊錶的節點是分散在堆空間裡面的,這時候cpu快取幫不上忙,只能是去讀取記憶體,平均讀取時間需要100個cpu時鐘週期。這樣算下來,陣列訪問的速度比煉表快33倍! (這裡只是介紹概念,具體的數字因cpu而異)。

因此,程式中盡量使用連續的資料結構,這樣可以充分發揮cpu快取的威力。這種對快取友好的演算法稱為 cache-obliviousalgorithm。

該回答源自:

六.亂七八糟

1.假如陣列中大部分元素已經排好序,現在要對它們排序,插入排序最快。

3.二分查詢

//二分查詢(折半查詢),版本1

int binarysearch1(int a, int value, int n)

新的開始 2018 11 26

荒廢了2年了,抬頭看看前路茫茫,低頭看看小路泥濘,偏頭看看遠方的大佬們,和正在努力向前奔跑的後進者們,又回頭看了看自己的身後,什麼都沒留下了。希望現在回頭不算太晚,希望未來的自己為今天的抉擇慶幸 就讓今天成為新的開始吧。發布部落格記錄每天的所見所學所感 記錄每天解決的題目,包括思路,實現,出現的問題...

mysql學習記錄 MySQL學習記錄 2

in 子查詢 select from student where id in 1,2 not in 不在其中 select from student where id not in 1,2 is null 是空 select from student where age is null is not...

java學習記錄

陣列雖然是引用資料型別,但它不是類 所以數字中沒有length 方法 只有length屬性。string型別 是乙個類 jdk中已經封裝好的類,是個final類,你可以去查api 類就有屬性和方法但是 string類中沒有length屬性,只有length 方法 1。陣列雖然是引用資料型別,但它不是...