131 lines
5.1 KiB
Java
131 lines
5.1 KiB
Java
/*This Java program is to implement graph structured stack. In computer science, a graph-structured stack is a directed acyclic graph where each directed path represents a stack. The graph-structured stack is an essential part of Tomita’s algorithm, where it replaces the usual stack of a pushdown automaton. This allows the algorithm to encode the nondeterministic choices in parsing an ambiguous grammar, sometimes with greater efficiency.*/
|
||
|
||
import java.util.ArrayList;
|
||
import java.util.Iterator;
|
||
import java.util.Scanner;
|
||
import java.util.Stack;
|
||
|
||
public class GraphStructuredStack
|
||
{
|
||
private ArrayList<Stack<Integer>> stackList;
|
||
private Stack<Integer> stack;
|
||
private int numberOfNodes;
|
||
private int adjacencyMatrix[][];
|
||
private int[] parent;
|
||
|
||
public GraphStructuredStack()
|
||
{
|
||
stackList = new ArrayList<Stack<Integer>>();
|
||
stack = new Stack<Integer>();
|
||
}
|
||
|
||
public void graphStructuredStack(int adjacencyMatrix[][],int source,int bottomNode)
|
||
{
|
||
boolean stackFound = false;
|
||
this.numberOfNodes = adjacencyMatrix[source].length - 1;
|
||
this.adjacencyMatrix = new int[numberOfNodes + 1][numberOfNodes +1];
|
||
this.parent = new int[numberOfNodes+ 1];
|
||
for (int sourceVertex = 1; sourceVertex <= numberOfNodes; sourceVertex++)
|
||
{
|
||
for (int destinationVertex = 1; destinationVertex <= numberOfNodes; destinationVertex++)
|
||
{
|
||
this.adjacencyMatrix[sourceVertex][destinationVertex]
|
||
= adjacencyMatrix[sourceVertex][destinationVertex];
|
||
}
|
||
}
|
||
stack.push(source);
|
||
int element, destination;
|
||
while (!stack.isEmpty())
|
||
{
|
||
element = stack.peek();
|
||
destination = 1;
|
||
while (destination <= numberOfNodes)
|
||
{
|
||
if (this.adjacencyMatrix[element][destination] == 1)
|
||
{
|
||
stack.push(destination);
|
||
parent[destination] = element;
|
||
this.adjacencyMatrix[element][destination] = 0;
|
||
if (destination == bottomNode)
|
||
{
|
||
stackFound = true;
|
||
break;
|
||
}
|
||
element = destination;
|
||
destination = 1;
|
||
continue;
|
||
}
|
||
destination++;
|
||
}
|
||
if (stackFound)
|
||
{
|
||
Stack<Integer> istack = new Stack<Integer>();
|
||
for (int node = bottomNode; node != source; node = parent[node])
|
||
{
|
||
istack.push(node);
|
||
}
|
||
istack.push(source);
|
||
stackList.add(istack);
|
||
stackFound = false;
|
||
}
|
||
stack.pop();
|
||
}
|
||
Iterator<Stack<Integer>> iterator = stackList.iterator();
|
||
while (iterator.hasNext())
|
||
{
|
||
Stack<Integer> stack = iterator.next();
|
||
Iterator<Integer> stckitr = stack.iterator();
|
||
while (stckitr.hasNext())
|
||
{
|
||
System.out.print(stckitr.next() +"\t");
|
||
}
|
||
System.out.println();
|
||
}
|
||
}
|
||
|
||
public static void main(String...arg)
|
||
{
|
||
int adjacencyMatrix[][];
|
||
int numberofnodes;
|
||
int source, bottom;
|
||
Scanner scanner = new Scanner(System.in);
|
||
System.out.println("enter the number of nodes");
|
||
numberofnodes = scanner.nextInt();
|
||
adjacencyMatrix = new int[numberofnodes + 1] [numberofnodes + 1];
|
||
System.out.println("enter the graph matrix");
|
||
for (int sourceVertex = 1; sourceVertex <= numberofnodes; sourceVertex++)
|
||
{
|
||
for (int destinationVertex = 1; destinationVertex <= numberofnodes; destinationVertex++)
|
||
{
|
||
adjacencyMatrix[sourceVertex][destinationVertex] = scanner.nextInt();
|
||
}
|
||
}
|
||
System.out.println("enter the source node");
|
||
source = scanner.nextInt();
|
||
System.out.println("enter the bottom node");
|
||
bottom = scanner.nextInt();
|
||
System.out.println("the stacks are");
|
||
GraphStructuredStack graphStructuredStack = new GraphStructuredStack();
|
||
graphStructuredStack.graphStructuredStack(adjacencyMatrix, source, bottom);
|
||
scanner.close();
|
||
}
|
||
}
|
||
|
||
|
||
/*
|
||
enter the number of nodes
|
||
6
|
||
enter the graph matrix
|
||
0 0 0 0 0 0
|
||
1 0 0 0 0 0
|
||
1 0 0 0 0 0
|
||
0 1 1 0 0 0
|
||
0 0 0 1 0 0
|
||
0 0 0 0 1 0
|
||
enter the source node
|
||
6
|
||
enter the bottom node
|
||
1
|
||
the stacks are
|
||
1 2 4 5 6
|
||
1 3 4 5 6 |