亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? transformmodel.java

?? 輸入一個(gè)正則表達(dá)式
?? JAVA
字號(hào):
 package reg402;

import java.util.Stack;
import java.awt.Point;
import java.awt.Rectangle;
import java.util.LinkedList;
import java.util.ArrayList;


public class TransformModel implements Constants {
  String[] regExp;           //正則表達(dá)式的分解串
  Graph transformGraph;      //圖形結(jié)構(gòu),用于存放結(jié)點(diǎn)和邊
  GraphNode[] node;
  private int temp;
  private Stack identifyStack;       //棧結(jié)構(gòu),用于存放標(biāo)識(shí)符
  private Stack operatorStack;       //棧結(jié)構(gòu),用于存入運(yùn)算符
  private Stack boundsStack;         //存入圖在視圖中的范圍
  private Stack graphStack;          //存放圖的結(jié)點(diǎn)集
  private int[] set1, set2;
  private Point p1, p2;
  private Rectangle bounds1, bounds2;
  private LinkedList specialEdgeList;       //存放特殊邊的鏈表


  public TransformModel() {

  }

  public boolean setRegExpression(String exp) {
    //設(shè)置正則表達(dá)式的字符串集形式
    int n = 0;
    if(canSplit(exp)) regExp = splitExp(exp);
    else return false;

    for(int i = 0; i < regExp.length; i++)
      if(!regExp[i].equals("") && regExp[i].compareTo("(") != 0
          && regExp[i].compareTo(")") != 0)  n++;
    transformGraph = new Graph(2*n);
    node = new GraphNode[2*n];

    for(int i = 0; i < 2*n; i++) {
      node[i] = new GraphNode();
    }

    return true;
  }

  private boolean canSplit(String exp) {
    //exp是否可以分解
    int n1 = 0, n2 = 0, n3 = 0;
    for(int i = 0; i < exp.length(); i++) {
      if (exp.charAt(i) == '\'') n1++;
      if(exp.charAt(i) == '(') n2++;
      if(exp.charAt(i) == ')') n3++;
    }
    return (n1%2 == 0 && n2 == n3);
  }

  private String[] splitExp(String exp) {
    //把字符串按意愿分解成字符串集
    char ch;
    int id = 0;
    int n = exp.length();
    String[] expSet = new String[n+1];
    StringBuffer buf;

    for(int i = 0; i < n + 1; i++)
      expSet[i] = "";

    for(int i = 0; i < n; i++) {
      ch = exp.charAt(i);
      if (ch == '\'') {   //可以由''來決定一個(gè)串
        buf = new StringBuffer();
        ch = exp.charAt(++i);
        while (ch != '\'') {
        buf.append(ch);
        ch = exp.charAt(++i);
        }
        expSet[id++] = new String(buf);
      }
      else expSet[id++] = String.valueOf(ch); //也可以由單個(gè)
                                                 //字符構(gòu)成
    }

    return expSet;
  }

  public Graph getGraph() {
    return transformGraph;
  }

  public boolean createNFA() {
    //創(chuàng)建非確定有窮自動(dòng)機(jī)
    identifyStack = new Stack();
    operatorStack = new Stack();
    boundsStack = new Stack();
    graphStack = new Stack();
    specialEdgeList = new LinkedList();

    temp = 0;
    int n = regExp.length;
    char ch;        //從運(yùn)算棧得到的字符

    int i = 0;
    while(regExp[i] != "") {
      if(!isOperator(regExp[i])) { //如是標(biāo)識(shí)符...
        GraphNode n1 = node[temp++];
        GraphNode n2 = node[temp++];
        basicOperate(n1, n2, n, i);
        if(regExp[i+1] != "" && (!isOperator(regExp[i+1]) || regExp[i+1].equals("(")))
          operatorStack.push(new Character('^'));

      }

      else if(isOperator(regExp[i])) { //如是運(yùn)算符...
        ch = regExp[i].charAt(0); //為了方便處理,把字符串轉(zhuǎn)換成字符

        switch(ch) {
          case '*':      //*的優(yōu)先級(jí)較高, 故先計(jì)算
            if(identifyStack.empty())
              return false;     //標(biāo)識(shí)符棧為空而運(yùn)算符棧不為空,故表達(dá)式錯(cuò)誤
            repeatOperate();
            if(regExp[i+1] != "" && (!isOperator(regExp[i+1]) || regExp[i+1].equals("(")))
              operatorStack.push(new Character('^'));
            break;

          case '|':      //可以進(jìn)行兩種運(yùn)算^和|
            if(identifyStack.empty())
              return false;     //標(biāo)識(shí)符棧為空而運(yùn)算符棧不為空,故表達(dá)式錯(cuò)誤
            if(!operatorStack.isEmpty()) {
              ch = ((Character)operatorStack.peek()).charValue();
              while(ch != '(') {
                ch = ((Character)operatorStack.pop()).charValue();;
                p2 = (Point)identifyStack.pop();
                p1 = (Point)identifyStack.pop();
                bounds2 = (Rectangle)boundsStack.pop();
                bounds1 = (Rectangle)boundsStack.pop();
                set2 = (int[])graphStack.pop();
                set1 = (int[])graphStack.pop();

                switch(ch) {
                  case '|':
                    choiceOperate();
                    break;

                  case '^':
                    appositeOperate();
                    break;
                }
                if(!operatorStack.isEmpty())
                  ch = ((Character)operatorStack.peek()).charValue();
                else break;
              }
            }
            operatorStack.push(new Character('|'));
            break;

          case '^':       //進(jìn)行一種運(yùn)算^
            if(identifyStack.empty())
              return false;     //標(biāo)識(shí)符棧為空而運(yùn)算符棧不為空,故表達(dá)式錯(cuò)誤
            if(!operatorStack.isEmpty()) {
              ch = ((Character)operatorStack.peek()).charValue();
              if(ch == '^') {
                p2 = (Point) identifyStack.pop();
                p1 = (Point) identifyStack.pop();
                bounds2 = (Rectangle) boundsStack.pop();
                bounds1 = (Rectangle) boundsStack.pop();
                set2 = (int[]) graphStack.pop();
                set1 = (int[]) graphStack.pop();

                ch = ( (Character) operatorStack.peek()).charValue();
                if(ch == '^')
                appositeOperate();
              }
              if(!operatorStack.isEmpty())
                  ch = ((Character)operatorStack.peek()).charValue();
                else break;

            }
            operatorStack.push(new Character('^'));
            break;

          case '(':         //直接進(jìn)入運(yùn)算棧
            operatorStack.add(new Character('('));
            break;

          case ')':         //計(jì)算在括號(hào)內(nèi)的值
            if(identifyStack.empty())
              return false;     //標(biāo)識(shí)符棧為空而運(yùn)算符棧不為空,故表達(dá)式錯(cuò)誤
            ch = ((Character)operatorStack.pop()).charValue();
            while(ch != '(') {
              p2 = (Point)identifyStack.pop();
              p1 = (Point)identifyStack.pop();
              bounds2 = (Rectangle)boundsStack.pop();
              bounds1 = (Rectangle)boundsStack.pop();
              set2 = (int[])graphStack.pop();
              set1 = (int[])graphStack.pop();

              switch(ch) {
                case '^':
                  appositeOperate();
                  break;
                case '|':
                  choiceOperate();
                  break;
              }
              ch = ((Character)operatorStack.pop()).charValue();
            }
            if(regExp[i+1] != "" && (!isOperator(regExp[i+1]) || regExp[i+1].equals("(")))
              operatorStack.push(new Character('^'));
            break;
            default: break;
        }
      }
      i++;
    }

    while(!operatorStack.isEmpty()) {
      ch = ((Character)operatorStack.pop()).charValue();
      p2 = (Point)identifyStack.pop();
      p1 = (Point)identifyStack.pop();
      bounds2 = (Rectangle)boundsStack.pop();
      bounds1 = (Rectangle)boundsStack.pop();
      set2 = (int[])graphStack.pop();
      set1 = (int[])graphStack.pop();

      switch(ch) {
        case '^':
          appositeOperate();
          break;

        case '|':
          choiceOperate();
          break;
      }
    }

    return true;
  }


  private void basicOperate(GraphNode n1, GraphNode n2, int n, int i) {
    //處理基本正則表達(dá)式
    int[] graphSet = new int[2*n];
    for(int loop = 0; loop < 2*n; loop++) {
      graphSet[loop] = -1;       //將要放入圖的結(jié)點(diǎn)集棧中
    }

    //設(shè)置結(jié)點(diǎn)在視圖上的初始值
    n1.setPosition(new Point(-2*RADIUS, 0));
    n2.setPosition(new Point(2*RADIUS, 0));

    transformGraph.setStart(n1);
    transformGraph.setEnd(n2);
    transformGraph.addEdge(n1, n2, regExp[i]);
    identifyStack.push(new Point(n1.getID(), n2.getID()));
    //把當(dāng)前邊的范圍壓入棧
    boundsStack.push(new Rectangle(-3*RADIUS, -RADIUS,
                     6*RADIUS, 2*RADIUS));
    //把邊集壓入棧, 不為-1的表示所對(duì)應(yīng)的結(jié)點(diǎn)存在
    graphSet[n1.getID()] = n1.getID();
    graphSet[n2.getID()] = n2.getID();
    graphStack.push(graphSet);
  }

  private void repeatOperate() {
    //重復(fù)
    Point p = (Point)identifyStack.pop();  //標(biāo)識(shí)符棧出棧
    Rectangle bounds = (Rectangle)boundsStack.pop();  //范圍棧出棧
    int[] set = (int[])graphStack.pop();
    EdgeLink special;

    GraphNode n1 = node[p.x],
        n2 = node[p.y],
        n3 = node[temp++],
        n4 = node[temp++];
    //設(shè)置n3, n4在視圖中的初始位置
    n3.setPosition(new Point(n1.getPosition().x - 4*RADIUS,
                             n1.getPosition().y));
    n4.setPosition(new Point(n2.getPosition().x + 4*RADIUS,
                             n2.getPosition().y));

    set[n3.getID()] = n3.getID();
    set[n4.getID()] = n4.getID();

    transformGraph.setStart(n3);
    transformGraph.setEnd(n4);
    transformGraph.addRepeatEdge(n1, n2, n3, n4);
    identifyStack.push(new Point(n3.getID(), n4.getID()));
    boundsStack.push(new Rectangle(n3.getPosition().x - RADIUS,
                                   bounds.y - 2*RADIUS, bounds.width + 8*RADIUS,
                                   bounds.height + 4*RADIUS));
    graphStack.push(set);
    special = new EdgeLink(n2, n1);
    specialEdgeList.add(new SpecialEdge(special, (Rectangle)boundsStack.peek()));
    special = new EdgeLink(n3, n4);
    specialEdgeList.add(new SpecialEdge(special, (Rectangle)boundsStack.peek()));
  }

  private void choiceOperate() {
    //在各項(xiàng)中選擇
    int offset;
    offset = -(bounds1.height + bounds1.y + RADIUS);
    moveY(set1, offset);
    offset = -bounds2.y + RADIUS;
    moveY(set2, offset);

    GraphNode n3 = node[temp++];
    GraphNode n4 = node[temp++];
    transformGraph.setStart(n3);
    transformGraph.setEnd(n4);
    transformGraph.addChoiceEdge(node[p2.x], node[p2.y],
                                 node[p1.x], node[p1.y],
                                 n3, n4);
    int width = Math.max(bounds1.width, bounds2.width);
    n3.setPosition(new Point(-width/2 - 3*RADIUS, 0));
    n4.setPosition(new Point(width/2 + 3*RADIUS, 0));

    int[] total = new int[set1.length];
    for(int loop = 0; loop < total.length; loop++) {
      total[loop] = set1[loop] + set2[loop] + 1;
    }
    total[n3.getID()] = n3.getID();
    total[n4.getID()] = n4.getID();

    identifyStack.push(new Point(n3.getID(), n4.getID()));
    boundsStack.push(new Rectangle(n3.getPosition().x - RADIUS, -bounds1.height - RADIUS,
                                   width + 8*RADIUS, bounds1.height + bounds2.height + 2*RADIUS));
    graphStack.push(total);
  }

  private void appositeOperate() {
    //并置
    int offset;
    offset = -bounds1.width/2 - RADIUS;
    moveX(set1, offset);
    offset = bounds2.width/2 + RADIUS;
    moveX(set2, offset);

    int[] total = new int[set1.length];
    for(int loop = 0; loop < total.length; loop++) {
      total[loop] = set1[loop] + set2[loop] + 1;
    }

    int height = Math.max(bounds1.height, bounds2.height);
    transformGraph.setStart(node[p1.x]);
    transformGraph.setEnd(node[p2.y]);
    transformGraph.addAppositiveEdge(node[p1.y], node[p2.x]);
    identifyStack.push(new Point(p1.x, p2.y));
    graphStack.push(total);

    Rectangle bounds = new Rectangle(-bounds1.width - RADIUS, Math.min(bounds1.y, bounds2.y),
                                   bounds1.width + bounds2.width + 2*RADIUS, height);
    offset = -bounds.x - bounds.width/2;
    moveX(total, offset);
    bounds.x += offset;
    boundsStack.push(bounds);
  }

  private void moveX(int[] set, int offset) {
    for(int i = 0; i < set.length; i++)
      if(set[i] != -1) {
        Point p = node[set[i]].getPosition();
        node[set[i]].setPosition(new Point(p.x + offset, p.y));
      }
  }

  private void moveY(int[] set, int offset) {
    for(int i = 0; i < set.length; i++)
      if(set[i] != -1) {
        Point p = node[set[i]].getPosition();
        node[set[i]].setPosition(new Point(p.x, p.y + offset));
      }
  }

  public Rectangle getBounds() {
    //返回圖在視圖中的初始位置
    return (Rectangle)boundsStack.peek();
  }

  public LinkedList getSpecialEdge() {
    return specialEdgeList;
  }

  private boolean isOperator(String str) {
    //判斷是否運(yùn)算符(包括())
    if(str.compareTo("*") == 0 | str.compareTo("|") == 0
       | str.compareTo("(") == 0 | str.compareTo(")") == 0)
      return true;
    return false;
  }
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧美视频在线观看| 中文字幕一区二区三区色视频| 国产精品一区二区久久不卡 | 欧美性猛片xxxx免费看久爱| 奇米色777欧美一区二区| 自拍偷拍国产精品| 久久色.com| 91精品国产综合久久精品图片| 成人免费精品视频| 精品影院一区二区久久久| 亚洲精品五月天| 国产人久久人人人人爽| 日韩欧美专区在线| 精品视频一区三区九区| 99久久精品情趣| 国模冰冰炮一区二区| 五月天亚洲精品| 亚洲精品视频免费看| 国产精品女主播av| 26uuu色噜噜精品一区| 91麻豆精品国产91久久久久| 色婷婷综合久久久中文一区二区 | 国产精品二三区| 国产女同性恋一区二区| 日韩免费高清电影| 欧美一级久久久久久久大片| 欧美色精品在线视频| 欧洲生活片亚洲生活在线观看| 成人免费高清在线观看| 国产精品亚洲专一区二区三区| 日本不卡中文字幕| 日本伊人午夜精品| 午夜视频久久久久久| 婷婷中文字幕综合| 午夜精品爽啪视频| 亚洲gay无套男同| 亚洲va天堂va国产va久| 亚洲一区二区三区四区五区黄| 亚洲欧美日韩一区二区| 亚洲欧美乱综合| 亚洲欧美国产三级| 亚洲美女精品一区| 一区二区三区日韩在线观看| 亚洲一区二区不卡免费| 夜夜爽夜夜爽精品视频| 亚洲高清免费在线| 日韩va亚洲va欧美va久久| 手机精品视频在线观看| 蜜臀久久久99精品久久久久久| 热久久免费视频| 精品一区二区三区的国产在线播放| 麻豆国产精品官网| 国产精品99久久久久久宅男| 成人免费av资源| 色综合久久综合| 欧美日韩国产另类不卡| 欧美一级专区免费大片| 精品区一区二区| 亚洲国产精品精华液2区45| 日韩伦理电影网| 性欧美疯狂xxxxbbbb| 免费人成在线不卡| 国内精品久久久久影院薰衣草| 国产精品996| 91视视频在线直接观看在线看网页在线看| 一本久久a久久免费精品不卡| 欧美亚洲丝袜传媒另类| 日韩精品一区二区在线| 国产精品久久久久国产精品日日| 亚洲黄一区二区三区| 日本成人在线视频网站| 国产成人综合在线观看| 在线视频国内自拍亚洲视频| 欧美一区二区高清| 国产精品视频看| 亚洲va国产天堂va久久en| 激情久久五月天| 91片黄在线观看| 日韩欧美一级精品久久| 国产精品欧美久久久久无广告 | 久久久久久影视| 亚洲欧美激情小说另类| 男男视频亚洲欧美| av在线不卡电影| 欧美一区二区女人| 亚洲色图在线播放| 蜜桃av一区二区| 91麻豆精品视频| 2020国产成人综合网| 亚洲欧美一区二区三区极速播放| 麻豆精品在线播放| 在线免费亚洲电影| 精品福利在线导航| 亚洲va韩国va欧美va| 成人福利电影精品一区二区在线观看| 欧美午夜精品久久久久久超碰 | 不卡视频一二三四| 欧美一区二区免费| 亚洲精品免费一二三区| 国产精品一区二区不卡| 欧美蜜桃一区二区三区| 国产精品国产三级国产普通话蜜臀| 免费人成网站在线观看欧美高清| 91麻豆免费观看| 国产视频一区在线观看| 日韩av电影一区| 91成人国产精品| 国产精品福利一区二区三区| 久久99久久久欧美国产| 欧美日韩一级大片网址| 亚洲欧美日韩国产综合| 国产凹凸在线观看一区二区| 欧美变态tickle挠乳网站| 午夜欧美电影在线观看| 91黄视频在线| 亚洲天堂免费在线观看视频| 福利一区二区在线观看| 久久综合色天天久久综合图片| 天天操天天干天天综合网| 在线精品视频一区二区三四 | 亚洲一区免费在线观看| 99vv1com这只有精品| 国产精品欧美久久久久一区二区| 国内国产精品久久| 精品日韩欧美在线| 九九九久久久精品| 欧美大胆人体bbbb| 久久99精品久久久久| 日韩欧美中文一区| 蜜桃av噜噜一区二区三区小说| 91精品国产综合久久久久久久| 爽好多水快深点欧美视频| 欧美老女人第四色| 日韩经典中文字幕一区| 91精品欧美久久久久久动漫| 手机精品视频在线观看| 欧美精品精品一区| 日日夜夜精品视频免费| 日韩视频一区二区在线观看| 日韩电影在线一区| 日韩午夜激情免费电影| 久久爱另类一区二区小说| 精品国产乱码久久久久久1区2区| 美女高潮久久久| www一区二区| 国产高清精品久久久久| 中文字幕欧美激情一区| 99久久国产免费看| 亚洲一区二区三区中文字幕在线| 欧美午夜电影一区| 日本aⅴ免费视频一区二区三区| 日韩免费视频线观看| 国产成+人+日韩+欧美+亚洲| 中文字幕在线不卡视频| 欧美亚洲高清一区二区三区不卡| 亚洲va欧美va人人爽午夜| 日韩美女视频在线| 成人激情免费网站| 夜夜嗨av一区二区三区网页| 7777精品伊人久久久大香线蕉的 | 欧美视频你懂的| 麻豆精品国产91久久久久久| 国产日产精品一区| 色成人在线视频| 日本伊人色综合网| 亚洲国产高清在线观看视频| 色婷婷综合久久久中文字幕| 天堂一区二区在线| 久久精品网站免费观看| 色哟哟日韩精品| 奇米888四色在线精品| 中文字幕乱码久久午夜不卡| 欧美亚洲一区二区在线| 久久电影网电视剧免费观看| 亚洲欧洲成人自拍| 欧美精品成人一区二区三区四区| 国产麻豆欧美日韩一区| 一区二区三区免费网站| 精品美女一区二区| 色综合天天综合在线视频| 欧美aaa在线| 亚洲色欲色欲www在线观看| 4438x成人网最大色成网站| 成人免费精品视频| 日本伊人午夜精品| 亚洲少妇最新在线视频| 日韩美女在线视频| 91电影在线观看| 粉嫩欧美一区二区三区高清影视| 亚洲国产乱码最新视频| 国产精品丝袜久久久久久app| 91精品国产综合久久国产大片| 成人精品鲁一区一区二区| 日本美女一区二区三区| 亚洲人成网站色在线观看| 久久九九国产精品| 欧美精品自拍偷拍| 91看片淫黄大片一级在线观看| 国产一区二区三区免费播放 | 一区二区三区免费|