//  S T A C K

#include	<stdio.h>
#include	<stdlib.h>

int stack_pointer;		// Stack pointer
int stack_size;		// Maksimal banyaknya data pada sebuah stack

// Menambahkan data val ke stack x

void push(int *x,int val)
{
	/* Selesaikan bagian ini
	
	(1) Periksalah terlebih dahulu, apakah stack overflow atau tidak
	(2) Jika tidak terjadi overflow, baru tambahkan data val ke stack x
	
	*/
}

// Menghapus data dari stack x

void pop(int *x)
{

	/* Selesaikan bagian ini
	
	(1) Periksalah terlebih dahulu, apakah stack itu underflow atau tidak
	(2) Jika tidak underflow, baru kemudian hapuslah data dari stack x, dan updatelah Stack pointer 
	
	*/

}

// Menampilkan data pada stack

void stack_view(int *x)
{
	int i;
	
	printf("\tKondisi stack:\t");
	if(stack_pointer==0) {
		printf("empty\n");
	}
	else {
	for(i=0;i<stack_pointer;i++)
		printf("%3d ",x[i]);
	printf("\n");
	}
}

// Fungsi main

void main()
{
	int *stack;
	int i,mode,val,stack_pointer;
	
	printf("Stack length: ");	
	scanf("%d",&stack_size);
	stack=(int *)malloc(stack_size*sizeof(int));
	if(stack==NULL) {
		printf("Alokasi memory gagal \n");
		exit(1);
	}
	for(i=0;i<stack_size;i++) stack[i]=0;  // Inisialisasi stack
	stack_pointer=0;	                  // Inisialisasi stack pointer

	while(1){
		printf("[1] push  [2] pop  [3] selesai \t");	scanf("%d",&mode);
		if(mode==3) break;
		switch(mode){
			case 1:
				printf("Data:\t");				scanf("%d",&val);
				push(stack,val);	// Tambahkan data val ke stack
				stack_view(stack);	// Tampilkan isi stack	
				break;
			case 2:
				pop(stack);			// Menghapus data dari stack
				stack_view(stack);		// Tampilkan isi stack
				break;
			default:
				break;
		}
	}
	free(stack);
}


