No.1
- 回答日時:
高度に抽象的なコードや、ハードウエアの
近隣のコード、構文解析以外ではほとんど使いません。
>どういったことに応用が効きますか?
スタックはUndoやブラウザの履歴(戻るボタン処理)
等に応用可能ですが、別にスタックでなくては
ならないというほどのことではありません。
キューは、単一の出力に対して複数の
アクセスが想定できる場合などに使いますが、
プロでないかぎり必要となる機会は、まずないでしょう。
この回答への補足
よく図入りの説明を見ると、なるほどとは思うのですが、
実際のプログラムは特殊なのでしょうか?
書籍見ても本見てもスタックやキューのプログラムを見ないので
どういったものが、スタックやキューを用いているプログラムなのか
わかりません。初級者でもわかるようなプログラムで教えてください。
No.2
- 回答日時:
パソコンのファイルはOSがHDD上でキューで持って
いますね。ですから、何箇所に分かれたりしても
続けて読み書きが出来ます。ちと、こじつけ?
スレッドがCPUの空き待ちはキューイングされます。
優先順位の高いスレッドが来たら、それより優先
順位が高いか同じスレッドの待ちの後ろに付けま
す。キューだと割り込みも簡単です。
QAM/QAMSというキューアクセスメソッド/キューア
クセスメソッドサービスというデータ管理が三菱の
制御用コンピュータにあります。
制御系には大いに役に立つ場面があるでしょう。
シミュレーションなどにも役に立ちそうですね。
今はデータベースといえばRDB(リレーショナルデー
タベース)が花盛りですが、NDB(ネットワークデー
タベース)もやはり制御系には多いですね。
NDBの構造はキューとしての利用も簡単です。
QAMには負けますが。
実際、工場では、例えば製鉄ですと、圧延する鉄の
塊が圧延待ちでキューイングされて、圧延されると、
リアルタイムで形状がデータベース上で形状が変わ
り、伸びた長さによって、全オーダから無駄が無い
ようにかつ納期に間に合うようにカットし、1つの
データが複数のデータになり、不良品は修理にキュー
イングされ、いいものは仕上げ工程にキューイング
され・・・・・とキューイングこそ制御といえる
かもしれません。
No.3
- 回答日時:
C で関数を呼び出したときの情報は (言語使用には書いてないけど実質的に) スタックで管理されます. だから, プログラム上で意識することはないとしても事実上常にスタックのお世話になっているということができます.
キューは.... ウィンドウシステムにおけるユーザの操作はいったんキューに入り, そこからしかるべきプログラムに送られるのが普通です. このようにして, (基本的に) ユーザが操作した順番に処理が行われることを保証しています.
この回答への補足
なるほど・・
では知らず知らずに配列使ったプログラムを書いているだけで
実は裏でスタックを意図した動きをしている、っていうことなんですね?
No.5
- 回答日時:
簡単な話で、
「スタックやキューを使わないと面倒なとき」に「スタックやキューは
便利」です。
例えば、ファイルから読み込んだ文字列をいったんため込んでおき、
先頭行から処理をするような場合。
各行の内容を配列に格納すると、ループカウンタが必要になります。
ですが、キューに保存しておけば、キューの先頭から1行ずつ
取り出して処理をしていけばいいので、ループカウンタとか、
今配列のどこを指しているのかなどは一切考えなくてもよいので
気楽です。
スタックもキューも、別にそれを使わなければ処理ができない
わけではないので、使いたいと思わない人は使わなければいいだけの
話です。私はスタックやキューが好きですから使いますが、使わない、
使ったことがないという人はプロでも多いと思います。
この回答への補足
スタックを使う、とありますが、これは概念なのでしょうか?
実際に本(C言語の入門書)を見てもFIFO,LIFOの図入り説明程度でして、
じゃあ実際にどういうものなの?と気になってもそれに対する説明が
ないものです。
広義に見て、メモリのように意図して使えるものなのか、
それとも、概念であり、意図せずに使わざるを得ない状態にあるのか、
使っているとはどういう状況を言うのかが明示的に説明されておらず、
さっぱりわかりません。
ですので、実際にコードを見て、これがスタック&キューを用いている
と解るようなものがあれば・・・と思っているのです。
言葉より絵(コード)で。
No.6
- 回答日時:
応用ですか。
あくまで一例ですが…。たとえば、ソフトを使っていて、
「あ、操作間違えた。元の状態に戻そう。」なんてこと、ありませんか?
操作をしたら、その都度、ソフトの内部状態をスタックにpushしておき、
ユーザーが「元に戻す」を押したら、スタックからpopして、1つ前の状態に戻す、なんてことをするのに使えます。
プリンターなんかは、キューを使ってるんじゃないかな。
プリンターが、プリントする速度はコンピュータのデータ転送速度に比べれば、
ずいぶん遅いですが、コンピュータがデータ送信をして印字が終わるのを待っていたら、
まったく仕事できません。というわけで、プリンターは、
コンピュータからデータが送られてきたら、データを一旦キューに
溜め、「印字を承りました」といって、処理をコンピュータに
返します。その後、プリンターは、キューからデータを取り出して印字を続けます。
まあ、感覚的にはこんな感じでしょうか。
No.7
- 回答日時:
キュー(FIFO)を使う例として、通信を例にあげて説明します。
PC1の上で動作しているアプリケーションAP1からPC2の上で動作しているアプリケーションAP2に対してデータを送信することを考えてみましょう。
(1) AP1は通信速度がどれくらいか知らないけれどとにかく順番通りにデータを送信したい。そこでAP1はPC1の通信手段の送信バッファに「送りたい順番で」データを書き込みます。
(2) PC1の通信手段は送信バッファに書き込まれたデータを「先頭から順に取り出して」AP2に送信します。
(3) PC2の通信手段はPC1から送られてきたデータを受信して、受信バッファに「受信した順に」書き込み、AP2に対してデータを受信したことを知らせます。
(4) AP2はPC2の受信バッファの「先頭から順に」データを取り出します。
これで、AP1からAP2に順番通りにデータを送信することができました。
ここで登場した送信バッファ、受信バッファはデータ構造で見るとキュー構造でできています。ここで、キューだと何が嬉しいか考えてみましょう。
送信バッファがキュー構造(FIFO)ならば、アプリケーション側はこれまでデータをいくつ書いたか覚えていなくても、とにかく最後尾にデータを書き込めば通信手段がデータを順番通りに送り出してくれます。
受信バッファがキュー構造(FIFO)ならば、アプリケーション側が受信バッファにたまっているデータがいくつあるか知らなくても、とにかく先頭から読み出せば受信した順番通りにデータを取り出すことができます。
このような通信は、USBやRS-232Cのようなシリアル通信だけでなく、ハードウェアを制御する場合やプログラムとプログラムが通信する場合でもほぼ同様の仕組み(FIFO)を使用してデータのやり取りを行います。
No.10ベストアンサー
- 回答日時:
> スタックを使う、とありますが、これは概念なのでしょうか?
そのとおりです。なので、実装の仕方は必要に応じて変わります。
> 言葉より絵(コード)で。
そうですね。ではリクエストにお答えします。以下、SH2マイコンのシリアル通信に関するソースコードの一部です。SH2がシリアル通信(UART)でデータを受信する際に呼び出される受信割り込みハンドラと、受信割り込みハンドラがため込んだ受信データを読み出すための関数です。
/**
*SCI1受信割り込みハンドラ
*/
#pragma interrupt( SCI1_rxi_int_handler )
void SCI1_rxi_int_handler(void)
{
char data;
data = SCI1.SCRDR; // 受信データを取り出す
SCI1.SCSSR.BIT.RDRF = 0; // 次の受信に備える
FIFO_put( (rxBuffer + 1) , data); // 受信バッファに貯め込む
}
/**
*SCI から受信データを読み込む。
*/
int SCI_read(char ch, char *buf, int len)
{
(中略)
for(i=0; i<len; i++){
ret = FIFO_get( (rxBuffer + ch), &c ); // 受信バッファから1つずつ取りだす
if( FIFO_OK == ret ){
*buf = c;
buf++;
}
else if( FIFO_ERROR_EMPTY == ret )// これ以上読み込むデータがない
break;
else{
i = SCI_ERROR_FATAL; // FIFOの初期化ができていない場合など
break;
}
}
set_imask( mask ); // 割り込みマスクを戻す
return i; // 読み込んだデータ数を返す。
}
ついでにFIFOはこのような構造を使いました。
/// データ構造の定義
typedef struct{
int rp; // 書き込み位置
int wp; // 読み出し位置
char *buffer; // データ保存領域へのポインタ
short bufferSize; // データ保存領域の大きさ
}FIFO;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 仕事術・業務効率化 使用中のソフトで、インボイス制度に対応する為の作業料が30万以上。普通? 4 2023/06/15 21:26
- PHP PHPでテキストファイルに保存した時の改行問題 1 2022/11/19 15:07
- SSL・HTTPS 掲示板サイトへの書き込みができない件(ブラウザソフトを変えてもできない) 2 2022/11/20 10:48
- PHP 「基礎からのMySQL 第3版 Kindle版」を数年前購入して全部やりました。 1 2022/09/15 05:32
- その他(教育・科学・学問) 「技術(テクノロジー)」と「工学(エンジニアリング)」の違いについて 5 2023/02/03 09:54
- 転職 現在転職活動中です。先日会社見学いった会社で面接してみたいと言われました。今まで製造業で今回も製造業 2 2023/04/02 21:44
- 借地・借家 簡易裁判所の退去費用の裁判の答弁書について 1 2023/03/07 19:33
- ニュース・地域情報 ①新聞やネットニュースを活用して、ニュースを読む(例:新型コロナウイルス第七波について、など) ②そ 1 2022/08/21 23:52
- 財務・会計・経理 取引先の先方から今後は注文した商品に対して弊社が発行する納品書や請求書を業務用・販売用・消耗品などに 1 2022/07/18 13:21
- Excel(エクセル) VBAで条件付き書式を設定 3 2023/07/14 17:52
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB.netでDLLを読み込んで実行す...
-
printf / sprintf のスタック消...
-
Cプログラミングの関数電卓のア...
-
スタックの仕組み
-
アセンブラでmain関数から作成...
-
スタックとキューの使い所
-
マス目上の移動のアルゴリズム
-
C言語・スタックを使用した逆...
-
基本情報技術者のデータ構造あ...
-
エラー?メッセージ
-
パソコンでインターネット接続...
-
ubuntuで デイスク/deb/loopと...
-
タイピングの癖
-
ルータの負荷対策でL2スイッチ...
-
第一級陸上特殊無線技士
-
SP領域とはなんですか?
-
タイピングソフト
-
乱数をC言語で
-
サブネットマスクが255.255.255...
-
イーサネット10Mbpsの通信速度...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.netでDLLを読み込んで実行す...
-
最大スタックサイズを大きくす...
-
エラー?メッセージ
-
printf / sprintf のスタック消...
-
_CRTIMPの意味は?
-
スタックを用いて整数配列を入...
-
スタックフレームの消滅
-
関数呼び出しでのスタック消費量
-
スタックの伸張方向
-
スタック領域変更
-
逆ポーランド記法
-
関数のプロローグとエピローグ...
-
Ethernetヘッダの取得 NDIS
-
スタックとキューの使い所
-
再帰処理を非再帰処理に書き換...
-
CASLとCASL2の違いについて
-
マス目上の移動のアルゴリズム
-
コンパイラオプション
-
VC++6.0 Stack Overflow !!
-
VCでのスタックサイズ
おすすめ情報