行列行列行列、循環行列、スタックを使用します.


いくつかの試験問題と筆記試験の面接の過程で、stackとqueueを使う必要がある時、STLに関連するライブラリ関数を使えないように要求されるかもしれません.つまり、純粋なCを使ってプログラミングする必要があります.しかし、試験中や筆記試験の面接では、スタックとキューを使用するために、完全なデータ構造を書くのはかなり手間がかかりますし、時間的にも必ずしも許可されていません.したがって、スタックとキューの実現を行列でシミュレートするのは賢明な選択です.時間を節約します.例えば、dfs()とbfs()では、この二つの論理の実現を考える時間がもっとかかります.二、配列シミュレーションを使用したスタックとキューは、標準ライブラリの容器類より効率的に多く、プログラムの実行速度をより速くすることができます.
1.配列シミュレーションスタックの実現配列シミュレーションスタックの実装は、スタックトップポインタの処理において、一般的に2つの処理方式top=-1とtop=0とがあり、つまり、この2つの場合、スタックの動作は異なることを意味する.(1)top=-1
#include  
#define MAX 100 //      

int s[MAX];
int top = -1;//        -1

void push(int x) {
	if(isFull()) return;
	else s[++ top] = x;
}
void pop() {
	if(isEmpty()) return;
	else top --;
}
int top() {
	if(isEmpty()) return -1;
	else return s[top];
}
bool isEmpty() {return top == -1;}
bool isFull() {return top == MAX-1;}
(1)top=0
#include  
#define MAX 100 //      

int s[MAX];
int top = 0;//        0

void push(int x) {
	if(isFull()) return;
	else s[top ++] = x;
}
void pop() {
	if(isEmpty()) return;
	else top --;
}
int top() {
	if(isEmpty()) return -1;
	else return s[top-1];
}
bool isEmpty() {return top == 0;}
bool isFull() {return top == MAX;}
どちらを選ぶかについては、みんなの習慣を見てください.
2.配列シミュレーションスタックの実現
#include 
#define N 100

int q[N];
int f=-1, r=-1;//             -1

void push(int x) {
	if(isFull()) return;
	q[++ r]  = x;
}
int front() {
	if(isEmpty()) return -1;
	return q[++ f];
}
bool isEmpty() {return f==r;}
bool isFull() {return r==N-1;}
3.配列シミュレーション循環行列の実現
循環列は本質的には、列の偽オーバーフローの問題を解決するために、偽オーバーフローは大量の記憶空間の浪費を引き起こす可能性がある.循環列は上記の問題を解決することができますが、列の空き状態と列の空き状態を判断するには処理が必要です.現在よく使われているのは、位置格納空間を犠牲にしてキューの二つの状態を判別することです.
#include 

#define N 6
int q[N];
int hh=0, tt=0

void push(int x) {
	if(isFull()) return;
	q[tt ++] = x;
	tt = (tt + 1) % N;
}
int front() {
	if(isEmpty()) return -1;
	int res = q[hh];
	hh = (hh + 1)  % N;
	return res;
}
bool isEmpty() {return hh==tt;}
bool isFull() {return (tt + 1) % N == hh;} 
int length() {return (tt - hh + N) % N;}