Вы находитесь на странице: 1из 14

LAPORAN RESMI

PRAKTIKUM 21-22 : STACK


KINTAN ASFIARANTI – 2103161060

LAPORAN PENDAHULUAN
Latihan
1. Dengan menggunakan package stack collection, buatlah program/class untuk
a. Konversi dari nilai desimal ke nilai biner, oktal dan heksadesimal.
Contoh :
Masukkan nilai desimal = 25
Hasil nilai biner = 11001
Hasil nilai oktal = 31
Hasil nilai heksadesimal = 19
 Source code
import java.util.Iterator;
import java.util.Scanner;
import java.util.Stack;

public class Latihan1 {


public static void main(String[] args) {
Scanner dataIn = new Scanner(System.in);
System.out.print("Masukkan nilai desimal : ");
int des = dataIn.nextInt();
System.out.println("Hasil nilai biner = "+toBinary(des));
System.out.println("Hasil nilai oktal = "+toOctal(des));
System.out.println("Hasil nilai heksadesimal =
"+toHexa(des));
}

public static String toBinary(int des){


Stack<String> s = new Stack<String>();
String bin="";
for(int n=des;n>=1;n/=2){
if(n%2==0)
s.push("0");
else s.push("1");
}
while(!s.empty())
bin+=s.pop();
return bin;
}
public static String toOctal(int des){
Stack<String> s = new Stack<String>();
String oct="";
for(int n=des;n>=1;n/=8){
s.push(Integer.toString(n%8));
}
while(!s.empty())
oct+=s.pop();
return oct;
}

public static String toHexa(int des){


Stack<String> s = new Stack<String>();
String hex="";
for(int n=des;n>=1;n/=16){
if(n%16==10)
s.push("A");
else if(n%16==11)
s.push("B");
else if(n%16==12)
s.push("C");
else if(n%16==13)
s.push("D");
else if(n%16==14)
s.push("E");
else if(n%16==15)
s.push("F");
else
s.push(Integer.toString(n%16));
}
while(!s.empty())
hex+=s.pop();
return hex;
}
}

 Output

 Analisa
Percobaan diatas menggunakan stack collection untuk menghitung dari nilai desimal
menjadi nilai biner, oktal dan heksadesimal. Untuk mencari nilai biner
mendefinisikan method toBinary(), toOctal(), toHexa dengan parameter int des.

b. Membalik kalimat dan menentukan sebuah kalimat termasuk palindrom atau


bukan
Masukkan kalimat : algoritma dan struktur data
Hasil = atad rutkurts nad amtirogla
Bukan palindrom
Masukkan kalimat : sugus
Hasil = sugus
Palindrom
 Soure code
import java.util.Stack;
import java.util.Scanner;

public class Latihan1B {


public static void main(String[] args) {
Scanner inp = new Scanner(System.in);
System.out.print("Masukkan kalimat : ");
String kal = inp.nextLine();
boolean status = palindrom(kal);
if(status)
System.out.println("Palindrom");
else
System.out.println("Bukan Palindrom");
}

public static boolean palindrom(String kal){


Stack <Character> stk = new Stack <Character>();
String str="";
boolean status = false;
int count = 0;
do{
stk.push(kal.charAt(count));
count++;
} while (count < kal.length());
while(!stk.isEmpty()){
str += stk.pop().charValue();
}
System.out.println("Hasil : " +str);
if(str.equals(kal))
status=true;
return status;
}
}
 Output

 Analisa
Pada percobaan diatas menentukan inputan dari user termasuk dalam palindrom atau
bukan. Percobaan diatas menggunakan method tambahan yaitu method palindrom().
Pada method palindrom program akan memproses inputan dari user apakah kalimat
yang dimasukkan termasuk palindrom atau bukan.

2. Dari soal latihan 1 untuk soal yang sama tetapi menggunakan stack dengan array.
 Source code
Stack.java
public interface Stack<T>{
abstract boolean isEmpty();
abstract T peek();
abstract T pop();
abstract void push(T item);
abstract int size();}
Latihan2.java

import java.util.EmptyStackException;

public class Latihan2<T> implements Stack<T> {


T value[];
int topOfStack;

public Latihan2(int size){


value = (T[]) new Object[size];
}

@Override
public boolean isEmpty() {
return topOfStack == 0;
}

@Override
public T peek() {
if(isEmpty()){
throw new EmptyStackException();
}
topOfStack--;
T temp = value[topOfStack];
topOfStack++;
return temp;
}

@Override
public T pop() {
if(isEmpty()){
throw new EmptyStackException();
}
topOfStack--;
return value[topOfStack];
}

@Override
public void push(T item) {
value[topOfStack] = item;
topOfStack++;
}

@Override
public int size() {
return topOfStack;
}

public String toString(){


String str = "";
for(int i=0; i<topOfStack; i++){
str += value[i] + " ";
}
return str;
}
}
Latihan2A.java
import java.util.Scanner;
public class Latihan2A {
public static void main(String[] args) {
Scanner scn = new Scanner(System.in);
System.out.print("Masukkan bilangan desimal : ");
int bil = scn.nextInt();

System.out.print("Hasil nilai biner : "


+baseString(bil, 2) + "\n");
System.out.print("Hasil nilai oktal : "
+baseString(bil, 8) + "\n");
System.out.print("Hasil nilai heksadesimal : "
+baseString(bil, 16) + "\n");
}

public static String baseString (int num, int b){


String digitChar = "0123456789ABCDEF", numStr = "";
Latihan2 <Character> stk = new Latihan2
<Character>(10);
do{
stk.push(digitChar.charAt(num%b));
num /= b;
} while(num!=0);

while(!stk.isEmpty()){
numStr += stk.pop().charValue();
}
return numStr;
}
}

import java.util.Scanner;
public class soal2b {
public static boolean palindrom(String kal){
int panj = kal.length();
Latihan2 <Character> stk = new Latihan2
<Character>(panj);
String str = "";
boolean status = false;
int count = 0;
do{
stk.push(kal.charAt(count));
count++;
} while(count < kal.length());
while(!stk.isEmpty()){
str += stk.pop().charValue();
}
System.out.println("Hasil : "+str);
if(str.equals(kal))
status = true;
return status;
}
public static void main(String[] args){
Scanner inp = new Scanner(System.in);
System.out.print("Masukkan kalimat : ");
String kal = inp.nextLine();
boolean status = palindrom(kal);
if(status)
System.out.println("Palindrom");
else
System.out.println("Bukan palindrom");
}
}

 Output2a

 Analisa
Pada class main menggunakan method tambahan yaitu baseString() dimana pada method
tersebut digunakan untuk menghitung inputan yang diberikan oleh user dari bilangan
desimal menjadi nilai biner, oktal dan desimal dengan menggunakan array.

 Output 2b

 Analisa
Pada percobaan diatas menentukan inputan dari user termasuk dalam palindrom atau
bukan. Percobaan diatas menggunakan method tambahan yaitu method palindrom().
Pada method palindrom program akan memproses inputan dari user apakah kalimat yang
dimasukkan termasuk palindrom atau bukan. Pada method main program akan
menampilkan hasil inputan dari user dengan menggunakan array.

3. Dari soal latihan 1 untuk soal yang sama tetapi menggunakan stack dengan arraylist.
 Source code
Stack.java
public interface Stack<T>{
abstract boolean isEmpty();
abstract T peek();
abstract T pop();
abstract void push(T item);
abstract int size();
}

Latihan.java
import java.util.ArrayList;
import java.util.EmptyStackException;
import java.util.Iterator;

public class Latihan<T> implements Stack<T> {


private ArrayList<T> stackList = null;

public Latihan(){
stackList = new ArrayList<T>();
}

@Override
public boolean isEmpty() {
return stackList.size() == 0;
}

@Override
public T peek() {
if(isEmpty()){
throw new EmptyStackException();
}
return stackList.get(stackList.size() - 1);
}

@Override
public T pop() {
if(isEmpty()){
throw new EmptyStackException();
}
return stackList.remove(stackList.size() - 1);
}

@Override
public void push(T item) {
stackList.add(item);
}

@Override
public int size() {
return stackList.size();
}
public Iterator<T> iterator(){
return stackList.iterator();
}
}

Latihan3a.java
import java.util.Scanner;

public class Latihan3 {


public static void main(String[] args) {
Scanner scn = new Scanner (System.in);
System.out.print("Masukkan bilangan desimal : ");
int bil = scn.nextInt();
System.out.print("Hasil nilai biner : " +baseString
(bil, 2) +"\n");
System.out.print("Hasil nilai oktal : " +baseString
(bil, 8) +"\n");
System.out.print("Hasil nilai heksadesimal : "
+baseString (bil, 16) +"\n");
}

public static String baseString(int num, int b){


String digitChar = "0123456789ABCDEF", numStr="";
Latihan <Character> stk = new Latihan <Character>();
do{
stk.push(digitChar.charAt(num%b));
num /= b;
} while (num != 0);
while (!stk.isEmpty()){
numStr += stk.pop().charValue();
}
return numStr;
}
}

Latihan3b.java
import java.util.Scanner;

public class Latihan3b {


public static boolean palindrom(String kal){
Latihan <Character> stk = new Latihan <Character>();
String str= "";
boolean status = false;
int count = 0;
do{
stk.push(kal.charAt(count));
count++;
} while (count < kal.length());
while(!stk.isEmpty()){
str += stk.pop().charValue();
}
System.out.println("Hasil : " +str);
if(str.equals(kal))
status = true;
return status;
}

public static void main(String[] args){


Scanner inp = new Scanner (System.in);
System.out.println("Masukkan kalimat : ");
String kal = inp.nextLine();
boolean status = palindrom(kal);
if(status)
System.out.println("Palindrom");
else
System.out.println("Bukan palindrom");
}
}

 Output 3a
 Analisa
Pada percobaan diatas sama dengan percobaan sebelumnya hanya saja pada percobaan
ini menggunakan ArrayList yang diimplementasikan. Pada main class terdapat method
baseString() yang digunakan untuk menerjemahkan inputan dari user menjadi nilai biner,
oktal dan heksadesimal.

 Output 3b

 Analisa
Pada percobaan diatas sama dengan percobaan sebelumnya hanya saja pada percobaan
ini menggunakan ArrayList yang diimplementasikan. Program diatas menentukan
inputan dari user termasuk dalam palindrom atau bukan. Percobaan diatas menggunakan
method tambahan yaitu method palindrom(). Pada method palindrom program akan
memproses inputan dari user apakah kalimat yang dimasukkan termasuk palindrom atau
bukan. Pada method main program akan menampilkan hasil inputan dari user.

4. Buatlah program untuk menghitung hasil dari ekspresi postfix dengan


mengimplementasikan class PostfixEval.
Contoh : hitunglah nilai dari ekspresi postfix berikut "4 3 5 * +"
 Source code
InfixToPostfix.java
import java.util.Stack;

public class InfixToPostfix {


String infixExp = "";
String postfixExp = "";
Stack<Character> s = new Stack<Character>();

public void setInfixExp(String infixExp) {


this.infixExp = infixExp;
}

public boolean isOperator(char ch) {


if (ch=='+' || ch=='-' || ch=='*' || ch=='/' ||
ch=='^') {
return true;
}
return false;
}
public int degreeOp(char op) {
if (op == '+' || op == '-') {
return 1;
} else if (op == '*' || op == '/') {
return 2;
} else if (op == '^') {
return 3;
} else {
return 0;
}
}

public String toPostfix() {


char ch;
for (int i = 0; i < infixExp.length(); i++) {
ch = infixExp.charAt(i);
if (isOperator(ch)) {
if (s.isEmpty() || degreeOp(ch)
> degreeOp(s.peek())) { //perbandingan
derajat relasi
s.push(ch);
} else {
postfixExp += s.pop();
do {
if (s.isEmpty() || degreeOp(ch)
> degreeOp(s.peek())) {
break;
} else {
//System.out.println(ch);
postfixExp += s.pop();
}
} while (degreeOp(ch) <=
degreeOp(s.peek()));
//perbandingan derajat relasi
s.push(ch);
}
} else if (ch == ')') {
do {
postfixExp += s.pop();
} while (s.peek() != '(');
s.pop();
} else if (ch == '(') {
s.push(ch);
} else {
postfixExp += ch;
}
}
if (!s.isEmpty()) {
do {
postfixExp += s.pop();
} while (!s.isEmpty());
}
return postfixExp;
}
}
PostfixEval.java
import java.util.Stack;
import java.util.StringTokenizer;

public class PostfixEval {


private String postfixExpression;

public PostfixEval() {
}

public int compute(int left, int right, char op) {


switch (op) {
case '+':
return left + right;
case '-':
return left - right;
case '/':
return left / right;
case '*':
return left * right;
case '%':
return left % right;
case '^':
return (int) Math.pow(left, right);
default:
return 0;
}
}

public int evaluate() {


Stack<String> op = new Stack<String>();
Stack<String> operand = new Stack<String>();
char[] tempToken = postfixExpression.toCharArray();
StringTokenizer st = new
StringTokenizer(postfixExpression);
for (int i = 0; i < tempToken.length; i++) {

if (tempToken[i] >= '0' && tempToken[i] <= '9') {

operand.push(Integer.toString(Character.getNumericValue(tempTo
ken[i])));
} else if (isOperator(tempToken[i])) {
op.push(Integer.toString(tempToken[i]));
int right = Integer.parseInt(operand.pop());
int left = Integer.parseInt(operand.pop());
int hasilPerhitungan = compute(left, right,
tempToken[i]);

operand.push(Integer.toString(hasilPerhitungan));
} else {
throw new ArithmeticException("Stack Kosong");
}
}
return Integer.parseInt(operand.pop());
}
Latihan4.java
import java.util.Scanner;

public class Latihan4 {


public static void main(String[] args) {
PostfixEval itp = new PostfixEval();
String infix;
Scanner key = new Scanner(System.in);
System.out.print("Infix Expression : ");
infix = key.nextLine();
itp.setPostfixExp(infix);
System.out.println("Postfix Expression : " +
itp.getPostFixExp());
int hasil = itp.evaluate();
System.out.println("Hasil : " + hasil);
}
}

 Output

 Analisa
Pada percobaan ini menginputkan sebuah infix expression lalu akan menampilkan
Postfix expressionnya dan hasil perhitungannya. Percobaan diatas
mengimplementasikan 2 kelas selain main class yaitu InfoxtoPostfix, PostfixEval. Pada
class PostfixEval digunakan untuk menghitung operand left dan right dengan operator.

KESIMPULAN
Salah satu struktur data yang paling dasar adalah array. Array hanya sejumlah item dari
jenis yang sama dan disimpan dalam rangka linear. Array memiliki batas yang ditetapkan pada
ukuran dan tidak bisa melampaui batas yang telah ditentukan. Pada percobaan ini kita membuat
program stack dengan menggunakan array. Array biasanya cenderung lebih muda dan lebih
efisien untuk mengorganisasi data.