Advertisement
karol_dziachan

Stack (vector) OCaml

Jan 8th, 2021
2,969
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 1.81 KB | None | 0 0
  1.  module type  MY_STACK =
  2.     sig
  3.       type 'a t
  4.       exception Empty of string
  5.       val size : int
  6.       val create : unit -> 'a t
  7.       val increase : 'a t -> unit
  8.       val push : 'a option * 'a t -> unit
  9.       val top : 'a t -> 'a
  10.       val pop : 'a t -> unit
  11.       val isEmpty : 'a t -> bool
  12.     end;;
  13.  
  14.  
  15.   module MyStack : MY_STACK =
  16.   struct
  17.     type 'a t = {mutable n: int; mutable a: 'a option array;}
  18.     exception Empty of string
  19.     let size = 5
  20.     let increase_factor = 2
  21.     let create ()= {n = 0 ; a = Array.make size None}
  22.     let increase s =
  23.       let newSize = size * increase_factor  in
  24.       let newArr = Array.make newSize None
  25.       in begin
  26.           for i = 0 to size-1 do
  27.             newArr.(i) <- s.a.(i)
  28.            done;  
  29.            size = newSize;
  30.            s.a <- newArr
  31.           end
  32.    let push(e, s) =
  33.     begin
  34.       if s.n = size then  increase s;
  35.       s.a.(s.n) <- e;
  36.       s.n <- s.n + 1;
  37.     end
  38.  
  39.   let top s = if s.n=0 then raise (Empty "module MyStack: top")
  40.    else match s.a.(s.n-1) with
  41.         Some elem -> elem
  42.         | None -> failwith  "module MyStack: top (implementation error!!!)"
  43.   let isEmpty s = s.n=0  
  44.   let pop s = if s.n = 0 then raise (Empty "module MyStack:pop")
  45.           else s.n <- s.n-1
  46.    
  47.   end;;
  48.  
  49.   let mys = StackMutList.create();;
  50.  
  51.  let testStack = MyStack.create();;
  52.  MyStack.isEmpty testStack;;
  53.  MyStack.push(Some(1), testStack);;
  54.  MyStack.push(Some(2), testStack);;
  55.  MyStack.push(Some(3), testStack);;
  56.  MyStack.push(Some(4), testStack);;
  57.  MyStack.isEmpty testStack;;
  58.  MyStack.top testStack;;
  59.  MyStack.pop testStack;;
  60.  MyStack.top testStack;;
  61.  MyStack.pop testStack;;
  62.  MyStack.top testStack;;
  63.  MyStack.pop testStack;;
  64.  MyStack.top testStack;;
  65.  MyStack.pop testStack;;
  66.  MyStack.isEmpty testStack;;
  67.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement