DSは、スタックとキューの操作をブログ02 -

0.PTAスコアスクリーンショット

1.今週学習概要

1.1は、スタックをまとめたもの

1.1.1スタック構造

顺式结构:
typedef struct stack{
     int data[MaxSize];
     int top;//记录栈顶位置
}Stack,*SqStack;
链式结构:
typedef struct lstack{
      int data:
      struct lstack *next;
}Lstack,*Slstack;

1.1.2は、スタックを初期化します

void InitiateStack(SqStack &sta)
{
    sta=new Stack;
    sta->top=-;
}

1.1.3スタック

void Push(SqStack &sta,int e)
{
     if(sta->top+1==MaxSize)//检查栈是否已满,非常重要!!!
     {
           return;
     }
     sta->top++;
     sta->data[sta->top]=e;
}

1.1.4スタック

void Pop(SqStack &sta)//单纯出栈,不保留栈顶元素
{
   if(sta->top==-1)//检查栈是否已空,非常重要!!!
       return
   sta->top--;
}

1.1.5トップの要素を返します

void GetTop(SqStack sta,int &e)
{
    if(sta->top==-1)
       return;
    e=sta->data[sta->top];
}

1.1.6破壊スタック

void DelStack(SqStack &sta)
{
     delete sta;
}

1.1.7開発 - 共有スタック


特別な場所:

  1. 通常のスタックに比べて、積層構造を「TOP1 + 1つの== TOP2」スタック満杯状態で決定され、開始位置「上部」に共有複数のMaxSizeに定義されています。
  2. 共同利用の小スタック、ように見える......

1.1.8アプリケーションスタック

再帰的なウェブブラウジング使用等、:スタックの特性は、生活の条件を満足する時に、FIFOデータである
シンボルペアリング:一般的なアプリケーション
の擬似コード

运用map容器将相应符号配对
输入字符串str并获取其长度length
for 遍历字符串
    if str[i]为左括号
        入栈
    else if str[i]为右括号
             取栈顶元素
            if mp[str[i]]==栈顶元素
                栈顶元素出栈
            else 
                return false

1.2キューの概要

1.2.1キュー構造

顺序队列:
typedef struct queue{
      int data[MaxSize];
      int front;
      int rear;
}Queue,*Squeue;
链式结构:
typedef struct queue {
	int num;
	struct queue *next;
}Queue,*Squeue;

typedef struct loc {
	Squeue front;
	Squeue rear;
}Qlink;

1.2.2ビルドキュー

void initiate(Squeue &q)
{
    q=new Queue;
    q->front=q->rear=-1;
}

キューに1.2.3

void EnQueue(Squeue &q,int e)
{
    if(q->rear+1==MAxSize) return false;
    q->rear=q->rear+1;
    q->data[q->rear]=e;
}

1.2.4キュー

void DeQueue(Squeue &q,int e)
{
    if(q->front==q->rear)  retuen;
    q->front=q->front+1;
    e=q->data[q->front];
}

1.2.5破壊キュー

void destroy(Squeue &q)
{
    delete q;
}

キューが空であるかどうか1.2.6

bool IsEmpty(Squeue q)
{
    return(q->front==q->rear);
}

1.2.7開発 - 循環キュー

  1. 円形の空間のキューの良好な利用や廃棄物を避けるために
  2. 差異条件を分析:リア=(1 +リア)%最大、フロント=(フロント+ 1)%最大

スタックとキューのご理解と学習経験について1.2。の話

  1. スタックとキューの理解:ときに供給元後の最初のスタックと線状生まれキューは、高度であり、FIFOは後者の、そのようなデータの特性に応じて、我々は自由に適切なデータ構造を選択することができます。
  2. 体験学習:最後の数週間は、リニアテーブルについての学習と比較し、スタックとキューは私が銀行の3つのトピックについては、私は問題を解決するための合理的な利用データを実感しました特にして、さらに深まったデータ構造の重要性を実感しました「プログラム=データ構造+アルゴリズム」の前に知っているにはあまりにも重要なのは、今は本当に感謝しています。また、学習のプロセスが実際にいくつかの困難、対象迷路聞くの霧で、PTAのトピックは、時には数時間で、唯一の長い道のりを言うことができます。

2.PTAラボの割り当て

2.1質問1:変換式

2.1.1コードのスクリーンショット

2.1.2タイトルPTAは、命令のリストを提出します

注:実際の話この質問、アイデアの問題はないが、問題は、不正な形式のマップ・コンテナのマップ・コンテナ、2つのエラーを使用することは問題外であります

2.2トピック2:銀行キューシンプルなシミュレーション

2.2.1コードのスクリーンショット

2.2.2タイトルPTAは、命令のリストを提出します


Qは:答えは間違っているの空、原因となる部分の後にスペース場合、S1またはS2の出力で誤分類が存在しない
A:はい、それは単一の数字が含まれているかどうかを判断するために、最初のサイクルで再び議論S2の

3.読み取ったコード

3.1タイトルと問題解決のコード

トピック:

コード:

public class SortedStack {
    Stack<int> stack = new Stack<int>();
    Stack<int> temp = new Stack<int>();

    public SortedStack()
    {
    }

    public void Push(int val)
    {
        /* 使用两个栈,stack 存储较大的值,temp用来临时存放较小的值
           调整两个栈,使临时栈的值小于插入值,主栈的值大于插入值,这样插入值才可以插入后依然有序
         */
        while (true)
        {
            var max = stack.Count == 0 ? int.MaxValue : stack.Peek();
            var min = temp.Count == 0 ? int.MinValue : temp.Peek();

            if (val > max)
            {
                temp.Push(stack.Pop());
            }
            else if (val < min)
            {
                stack.Push(temp.Pop());
            }
            else
            {
                // 此时调整好了
                break;
            }
        }

        // 往栈写入数据
        stack.Push(val);
    }

    public void Pop()
    {
        // 将临时栈内的数据返回已有栈
        while (temp.Count > 0)
        {
            stack.Push(temp.Pop());
        }

        if (stack.Count == 0)
        {
            return;
        }

        stack.Pop();
    }

    public int Peek()
    {
        // 将临时栈内的数据返回已有栈
        while (temp.Count > 0)
        {
            stack.Push(temp.Pop());
        }

        if (stack.Count == 0)
        {
            return -1;
        }

        return stack.Peek();
    }

    public bool IsEmpty()
    {
        return stack.Count == 0 && temp.Count == 0;
    }
}

3.1.1デザインのアイデアの問題

  1. スタックSの並べ替えを達成するために、一時ボロー補助スタック

  2. プッシュ操作の場合、スタックは空の「!S.empty()」と、スタックの最上位は「s.top()<ヴァル」、そしてスタックの一時へトップ要素、および先頭の要素の少ないヴァル以上ではない場合2つの要件は、これまで満たされていないまで、ポップ

  3. Sスタックが空である、または「s.top()> =ヴァル」Sはスタックヴァルにプッシュされた場合、およびSのスタック温度要素上に最終的にスタック。

3.1.2質問の擬似コード

建立temp,stack两个栈
void push(int val)
{
    遍历数据,大数入stack,小数入temp
    stack.Push(val)
}

void Pop()
{
    将临时栈内的数据返回stack
}

int Peek()
{
    将临时栈内的数据返回temp
    return stack.Peek()
}

3.1.3業績

トピックを解決するための利点と問題点の分析3.1.4。

カジュアル作業は、一般的な要件に基づいており、それが唯一の補助スタックの使用を可能にし、各プッシュする前に、スタックが少ない現在の要素よりなり、プッシュバックが完了した後、補助スタックをプッシュする、と考えることは容易であり、スタックの各現在のトップは単なるポップ要素が飛び出しことができます。しかし、実際には、我々は2I回を移動する必要があります:最初のi個の要素がスタックに、次にn個の要素、補助スタックに移動し、最終的に補助スタック要素が戻って、この不活性アップデート(ではないが非常に移動することができます大幅にコードを最適化)を理解します。

3.2タイトルと問題解決のコード

トピック:

コード:

3.2.2業績

問題解決のトピックでの利点と問題点の分析3.2.3

2つのスタック、データ格納順序、及び反転データ用の他、プッシュエンドノードを追加することで、ポップは、ノードコンテンツの最初のノードを削除して返すことで、PEEK値は、ヘッドノードの最初のノードを除去せずに行われます。

おすすめ

転載: www.cnblogs.com/my-sky-2019/p/12548430.html