Sabtu, 22 Mei 2010

Program flip cake

/*
Name: Rudy Tri(5109100031), Anak Agung Ngurah Bagus Trihatmaja(5109100040)
Description: Program ini menghitung jumlah flip terbanyak yang harus dilakukan agar sebuah data terurut.
Program ini meminta inputan berupa banyaknya data beserta data-datanya. Output berupa langkah-langkah
yang dilakukan beserta terkhir jumlah langkah-langkah minimal yan harus dilakukan.
*/


/*PREPOSESOR*/
#include
#include
#include
#include

//inisialisasi struct stack yang akan digunakan
struct stack
{
int data;
struct stack *next;
};
stack *top=NULL;
stack *help;//variabel global

//inisialisasi struct queue yang akan digunakan
struct queue
{
int data;
struct queue *next;
struct queue *prev;
};
queue *head=NULL;
queue *tail=NULL;
queue *temp;//variabel global

/*fungsi enqueue sebenarnya sama dengan fungsi addLast pada linked list*/
void enqueue(int no)
{
queue *n=(queue*)malloc(sizeof(queue));
n->data=no;

if(head==NULL)
{
head=tail=n;
n->next=n->prev=NULL;
}
else
{
tail->next=n;
tail=n;
tail->next=NULL;
}
}
/*fungsi ini mengeluarkan isi dari node pertama pada linked list queue namun tidak menghilangkannya, fungsi ini hanya
memindahkan headnya saja*/
int dequeue()
{
int x;
temp=head;

x=temp->data;
head=head->next;
return(x);
}

/*fungsi push sebenarnya sama dengan fungsi addLast pada linked list*/
void push(int no)
{
stack *n=(stack*)malloc(sizeof(stack));
n->data=no;

if(top==NULL)
{
top=n;
top->next=NULL;
}
else
{
n->next=top;
top=n;
}
}

/*fungsi ini mengeluarkan isi dari node terakhir pada linked list queue namun tidak menghilangkannya, fungsi ini hanya
memindahkan topnya saja*/
char pop()
{
char temp;

if(top==NULL)
return 0;
else
{
temp=top->data;
top=top->next; // pindahkan posisi top
return temp;
}
}

/*fungsi untuk mencetak isi dari linked list stack*/
void printS()
{
help=top;

for(help; help!=NULL; help=help->next)//looping untuk membaca
printf("%d\n",help->data);
}

/*fungsi ini berfungsi untuk mengecek spakah stack sudah terurut atau belum*/
int sorted()
{
help=top;

while(help->next!=NULL)
{
if(help->data<=(help->next)->data)help=help->next;//jika data pertama lebih kecil dari data berikutnya maka lanjutkan mengecek
else return 0;//jika data pertama lebih besar dari data berikutnya maka keluar
}

return 1;//jika sudah terurut
}

void flip(int jumlah)//fungsi untuk memflip hingga tersorting.
{
int cek=0, simpan, posisi, posisi2, k;

printf("Langkah-langkahnya yaitu : \n");
while(!sorted())//selama masih tidak urut
{
simpan=0;
posisi=0;
help=top;
for(k=0; k {
posisi++;//counter posisi terus maju
if(help->data>=simpan)//jika ada yang lebih besar gantikan
{
simpan=help->data;
posisi2=posisi; //simpan posisi data maksimum
}
help=help->next;
}
if(sorted())break;//cek lagi sudah tersorting atau belum,jika sudah keluar dari loop
if(posisi2!=1 && posisi2!=jumlah)
{
for(k=0; k enqueue(pop());
for(k=0; k push(dequeue());
cek++;//counter banyak langkah
printf("\n");
printS();//tampilkan langkah
system("PAUSE");
}

if(sorted())break;//cek tersorting/tidak

else if(posisi2!=jumlah)
{
for(k=0; k enqueue(pop());
for(k=0; k push(dequeue());
cek++;//counter langkah
printf("\n");
printS();//tampilkan langkah
system("PAUSE");
}
jumlah--;//kurangi jumlah agar data yang terbesar tadi tidak diflip kembali
}
printf("Langkah minimum yang diperlukan: %d", cek);//tampilkan output
}

main()
{
int jumlah, data, data2;
printf("Input banyak angka: ");
scanf("%d", &jumlah);
for(int r=0; r {
printf("masukkan angka: \n");
scanf("%d", &data);
push(data);
}

flip(jumlah);//panggil fungsi untuk flip

getch();
}

Program konversi Postfix ke Infix

/*
Name: Rudy Tri(5109100031), Anak Agung Ngurah Bagus Trihatmaja(5109100040)
Description: Program ini bertujuan untuk mengubah bentuk postfix menjadi infix dengan menggunakan konsep stack dalam linked list. Program ini meminta inputan berupa string maksimal 100 karakter dan mengeluarkan output berupa char.
*/


/*PREPOSESOR*/
#include
#include
#include
#define MAX 100


/*struct untuk linked list stack*/
typedef struct node
{
node *next;
node *prev;
char opnd;
};

typedef struct node *stack;

/*struct untuk head dan tail linked list*/
typedef struct list
{
stack head,tail;
};


/*untuk membuat node baru diperlukan alokasi memory
fungsi ini bertujuan untuk mengalokasikan memory bagi node*/
stack getnode()
{
stack p;
p =(stack)malloc(sizeof(node));
return (p);
}

/*setelah selesai memakai memory, diperlukan memory release agar kinerja
komputer setelah running program ini tetap baik. Namun tidak terlalu berpengaruh pada
komputer jaman sekarang*/
void freenode(list *lst)
{
stack temp;
for(temp=lst->head;temp!=NULL;temp=temp->next)
free(temp);
}


/*fungsi pop dalam konsep stack. Mengeluarkan elemen terakhir dalam linked list*/
char pop(list *lst)
{
stack temp;
temp=lst->tail;

if(lst==NULL){
printf("stack is empty");
exit(1);
}

while(temp->next!=NULL)//while ini bertujuan untuk mencari elemen terakhir dalam linked list
{
temp=temp->next;
}

if(temp->next==NULL)//apabila node terakhir tersebut telah ditemukan maka return isinya*/
{
return temp->opnd;
}
}

/*fungsi untuk menghapus node terakhir dalam linked list. Pada fungsi pop sebelumnya, elemen terakhir
hanya dikembalikan isinya namun tidak dihapus. Sebenarnya fungsi tersebut bisa saja disederhanakan sehingga
tidak perlu menggunakan fungsi remove last.
*/

void removeLast(list *lst)
{
stack temp;
if(lst== NULL){
printf("stack is empty");
}
else{
temp=lst->tail;
if(lst->head!=lst->tail){
lst->tail = (lst->tail)->prev;
(lst->tail)->next=NULL;
}
else{
lst->head=lst->tail=NULL;
}
free(temp);
}
}

/*fungsi untuk menginputkan elemen ke dalam linked list*/
void push(list *lst, char op)
{
stack temp;

temp = getnode();//alokasi memory
temp->opnd = op;
temp->next = NULL;//dalam C akan lebih baik jika kita menginisialisasikan sebelumnya
temp->prev = NULL;

if(lst->head == NULL){ //jika linked list kosong atau untuk input yang pertama kali
lst->head = temp;
}
else{
/*menghubungkan node yang baru dengan node paling terakhir dalam linked list*/
temp->prev = lst->tail;
lst->tail->next = temp;
}
lst->tail=temp;//mengubah posisi tail dalam linked list
}

/*fungsi ini memberi nilai pada tiap operator untuk menentukan prioritas operator*/
int priority(char e)
{
int pri = 0;
if(e == '^')
pri = 5;
else if(e == '*' || e == '/' || e =='%')
pri = 3;
else if(e == '+' || e == '-')
pri = 1;
return pri;
}

main()
{

/*INISIALISASI*/
list lst;
lst.head=NULL; //inisialisasi head dan tail
lst.tail=NULL;

char inputChar[MAX]; //array untuk menampung input
char opStackfix[MAX];//array untuk menampung output

int count=0; //digunakan sebagai counter indeks dalam array
int charlong=0;//digunakan sebagai counter indeks dalam array
int arrcount=0;//digunakan sebagai counter indeks dalam array


/*INPUT*/
printf("Postfix input is(max. 100 character) : ");
scanf("%s",inputChar);

/*cari banyaknya karakter dalam input, karena berikutnya dalam konversi postfix ke infix karater dibaca dari belakang*/
while(inputChar[charlong]!= '\0')
{
charlong++;
}

for(count=charlong-1;count>=0;count--)//baca input dari belakang
{
if(inputChar[count]=='+' || inputChar[count]=='-' || inputChar[count]=='*' || inputChar[count]=='/' ||inputChar[count]=='^')
push(&lst,inputChar[count]);//selama karakter masukkan ke stack

else{
opStackfix[arrcount]=inputChar[count];//selain karakter inputkan ke array output
arrcount++;
if(lst.head!=NULL){//pop stack selang seling dengan input ke array output
opStackfix[arrcount]=pop(&lst);
removeLast(&lst);
arrcount++;
}

}
}

/*DISPLAY OUTPUT*/
printf("Infix output is : ");

for(arrcount;arrcount>=0;arrcount--)
printf("%c",opStackfix[arrcount]);

getch();
}

Program Konversi Infix ke Postfix

/*
Name:Rudy Tri(5109100031), Anak Agung Ngurah Bagus Trihatmaja (5109100040)
Description: Program ini bertujuan untuk mengubah bentuk infix menjadi postfix dengan menggunakan konsep stack dalam linked list. Program ini meminta inputan berupa string maksimal 100 karakter dan mengeluarkan output berupa char. */


/*PREPOSESOR*/
#include
#include
#include
#define MAX 100


/*struct untuk linked list stack*/
typedef struct node
{
node *next;
node *prev;
char opnd;
};

typedef struct node *stack;

/*struct untuk head dan tail linked list*/
typedef struct list
{
stack head,tail;
};

/*untuk membuat node baru diperlukan alokasi memory
fungsi ini bertujuan untuk mengalokasikan memory bagi node*/
stack getnode()
{
stack p;
p =(stack)malloc(sizeof(node));
return (p);
}

/*setelah selesai memakai memory, diperlukan memory release agar kinerja
komputer setelah running program ini tetap baik. Namun tidak terlalu berpengaruh pada
komputer jaman sekarang*/
void freenode(list *lst)
{
stack temp;
for(temp=lst->head;temp!=NULL;temp=temp->next)
free(temp);
}

/*fungsi pop dalam konsep stack. Mengeluarkan elemen terakhir dalam linked list*/
char pop(list *lst)
{
stack temp;
temp=lst->tail;

if(lst==NULL){
printf("stack is empty");
exit(1);
}

while(temp->next!=NULL)//while ini bertujuan untuk mencari elemen terakhir dalam linked list
{
temp=temp->next;
}

if(temp->next==NULL)//apabila node terakhir tersebut telah ditemukan maka return isinya*/
{
return temp->opnd;
}
}

/*fungsi untuk menghapus node terakhir dalam linked list. Pada fungsi pop sebelumnya, elemen terakhir
hanya dikembalikan isinya namun tidak dihapus. Sebenarnya fungsi tersebut bisa saja disederhanakan sehingga
tidak perlu menggunakan fungsi remove last.
*/
void removeLast(list *lst)
{
stack temp;
if(lst== NULL){
printf("stack is empty");
}
else{
temp=lst->tail;
if(lst->head!=lst->tail){
lst->tail = (lst->tail)->prev;
(lst->tail)->next=NULL;
}
else{
lst->head=lst->tail=NULL;
}
free(temp);
}
}

/*fungsi untuk menginputkan elemen ke dalam linked list*/
void push(list *lst, char op)
{
stack temp;

temp = getnode();//alokasi memory
temp->opnd = op;
temp->next = NULL;//dalam C akan lebih baik jika kita menginisialisasikan sebelumnya
temp->prev = NULL;

if(lst->head == NULL){//jika linked list kosong atau untuk input yang pertama kali
lst->head = temp;
}
else{
/*menghubungkan node yang baru dengan node paling terakhir dalam linked list*/
temp->prev = lst->tail;
lst->tail->next = temp;
}
lst->tail=temp; //mengubah posisi tail dalam linked list
}

/*fungsi ini memberi nilai pada tiap operator untuk menentukan prioritas operator*/
int priority(char e)
{
int pri = 0;
if(e == '^')
pri = 5;
else if(e == '*' || e == '/' || e =='%')
pri = 3;
else if(e == '+' || e == '-')
pri = 1;
return pri;
}


int main()
{
/*INISIALISASI*/
char infix[MAX];//array untuk menampung input
char postfix[MAX];//array untuk menampung output
char t;//variabel temporary

list lst;
lst.head=NULL;//inisialisasi head dan tail
lst.tail=NULL;

int i;//digunakan dalam looping sebagai counter
int count=0;//digunakan untuk menentukan indeks dalam array postfix
int stackvalue=-1,nextvalue=-1; //digunakan sebagai pembanding prioritas operator
int flag=0;//digunakan sebagai counter linked list stack

/*INPUT*/
printf("Infix input is[max 100 character] : ");
scanf("%s",infix);

for(i=0;infix[i]!='\0';i++)//looping untuk mengecek input perkarakter
{


if(infix[i]=='/' || infix[i]=='*' || infix[i]=='+' || infix[i]=='-' || infix[i]=='^' || infix[i]=='(' || infix[i]==')')
/* untuk menentukan apakah karakter dalam input merupakan operand atau tidak */
/* tanda '(' dan ')'masuk ke dalam stack namun tidak memiliki nilai prioritas */
{

if(lst.head==NULL)//saat pertama kali menginputkan
{
if(infix[i]!='(')
{
stackvalue=priority(infix[i]);
}
}



else if(lst.head!=NULL)//ketika stack tidak kosong
{

if(infix[i] != '(' || (lst.tail)->opnd != '(')
{
/*cek prioritas*/
t=(lst.tail)->opnd;
stackvalue=priority(t);
nextvalue=priority(infix[i]);

}

if(nextvalue < stackvalue || infix[i] == ')')
{
/*bandingkan nilai prioritas dan cek apakah ada prioritas pengerjaan(ex : (a+b)*c))*/
while(flag!=0 && (lst.tail)->opnd != '(')
/*looping pop selama stack tidak kosong dan sampai menemukan '('*/
{
postfix[count]=pop(&lst);
removeLast(&lst);
count++;
flag--;
}

if(flag!=0 && (lst.tail)->opnd=='('){
/*jika stack tidak kosong dan terdapat '(' maka langsung di pop namun tidak masuk
ke dalam array output*/
removeLast(&lst);
flag--;
}
}
}

if(infix[i]!=')'){
/*operator ')' tidak masuk ke dalam stack. operator ')' hanya sebagai penanda*/
push(&lst,infix[i]);
flag++;
}

}

else//selain operator masukkan ke array postfix
{
postfix[count]=infix[i];
count++;
}

}


while(flag!=0)//jika stack tidak kosong maka pop sampai stack kosong
{
postfix[count]=pop(&lst);
removeLast(&lst);
count++;
flag--;
}

/*TAMPILKAN OUTPUT*/
printf("Postfix iutput is : ");
for(int j=0;j {
printf("%c",postfix[j]);
}


getch();
}