correct push
[calc.git] / stack.c
CommitLineData
24724cdc 1#include <math.h>
a24bd519 2#include <stdio.h>
a24bd519 3
a24bd519
LM
4#include "debug.h"
5#include "format.h"
6#include "parser.h"
3559b26c 7#include "tabular.h"
a24bd519
LM
8
9#include "stack.h"
10
11/* global variables */
12
3559b26c 13tab_t * stack = NULL;
a24bd519
LM
14
15/* stack management */
16
17double get (int n)
18{
3559b26c 19 return get_tab (stack, n);
a24bd519
LM
20}
21
22double length ()
23{
3559b26c 24 return size_tab (stack);
a24bd519
LM
25}
26
27double pop ()
28{
3559b26c 29 return pop_tab (stack, -1);
a24bd519
LM
30}
31
32double push (double val)
33{
24724cdc
LM
34 double ret = NAN;
35 if (stack) {
36 ret = push_tab (stack, -1, val);
37 } else {
38 stack = resize_tab (stack, 1);
39 ret = set_tab (stack, 1, val);
40 }
41 return ret;
a24bd519
LM
42}
43
44double put (int n, double val)
45{
3559b26c
LM
46 if (n > size_tab (stack)) {
47 stack = resize_tab (stack, n);
a24bd519 48 }
3559b26c 49 return set_tab (stack, n, val);
a24bd519
LM
50}
51
52double set (int nbops, element_t **ops)
53{
54 int i;
3559b26c
LM
55 stack = resize_tab (stack, nbops);
56 for (i = 0; i < nbops; i++) {
57 set_tab (stack, i + 1, evaluate_element (ops[i], 0));
58 }
59 return size_tab (stack);
a24bd519
LM
60}
61
62void show (void)
63{
3559b26c 64 int i, n = size_tab (stack);
a24bd519 65 fprintf (stdout, "stack:");
3559b26c 66 for (i = 0; i < n; i++) {
a24bd519 67 fprintf (stdout, " ");
3559b26c 68 fprintf (stdout, minform, get_tab (stack, i + 1));
a24bd519
LM
69 }
70 fprintf (stdout, "\n");
71}
72
73/* stack functions */
74
75double max ()
76{
77 double ret = 0;
3559b26c
LM
78 int i, n = size_tab (stack);
79 if (n < 1) {
80 VERBOSE (WARNING, fprintf (stdout, "error not enough element in stack (%d)\n", n));
a24bd519
LM
81 return 0;
82 }
3559b26c
LM
83 ret = get_tab (stack, 1);
84 for (i = 1; i < n; i++) {
85 double cur = get_tab (stack, i + 1);
86 if (cur > ret) {
87 ret = cur;
a24bd519
LM
88 }
89 }
90 return ret;
91}
92
93double mean ()
94{
95 double ret = 0;
3559b26c
LM
96 int i, n = size_tab (stack);
97 if (n < 1) {
98 VERBOSE (WARNING, fprintf (stdout, "error not enough element in stack (%d)\n", n));
a24bd519
LM
99 return 0;
100 }
3559b26c
LM
101 for (i = 0; i < n; i++) {
102 ret += get_tab (stack, i + 1);
a24bd519 103 }
3559b26c 104 return ret / n;
a24bd519
LM
105}
106
107double min ()
108{
109 double ret = 0;
3559b26c
LM
110 int i, n = size_tab (stack);
111 if (n < 1) {
112 VERBOSE (WARNING, fprintf (stdout, "error not enough element in stack (%d)\n", n));
a24bd519
LM
113 return 0;
114 }
3559b26c
LM
115 ret = get_tab (stack, 1);
116 for (i = 1; i < n; i++) {
117 double cur = get_tab (stack, i + 1);
118 if (cur < ret) {
119 ret = cur;
a24bd519
LM
120 }
121 }
122 return ret;
123}
124
125void order ()
126{
3559b26c
LM
127 int n = size_tab (stack);
128 if (n < 3) {
129 VERBOSE (WARNING, fprintf (stdout, "error not enough element in stack (%d)\n", n));
130 } else {
131 order_tab (stack);
a24bd519
LM
132 }
133}
134
135double median ()
136{
137 double ret = 0;
3559b26c
LM
138 int n = size_tab (stack);
139 if (n < 3) {
140 VERBOSE (WARNING, fprintf (stdout, "error not enough element in stack (%d)\n", n));
141 } else {
142 tab_t *tmp = copy_tab (stack);
143 order_tab (tmp);
144 ret = get_tab (tmp, (n - 1) / 2 + 1);
145 free_tab (tmp);
a24bd519 146 }
a24bd519
LM
147 return ret;
148}
149
150double prod ()
151{
152 double ret = 1;
3559b26c
LM
153 int i, n = size_tab (stack);
154 if (n < 1) {
155 VERBOSE (WARNING, fprintf (stdout, "error not enough element in stack (%d)\n", n));
a24bd519
LM
156 return 0;
157 }
3559b26c
LM
158 for (i = 0; i < n; i++) {
159 ret *= get_tab (stack, i + 1);
a24bd519
LM
160 }
161 return ret;
162}
163
164double sum ()
165{
166 double ret = 0;
3559b26c
LM
167 int i, n = size_tab (stack);
168 if (n < 1) {
169 VERBOSE (WARNING, fprintf (stdout, "error not enough element in stack (%d)\n", n));
a24bd519
LM
170 return 0;
171 }
3559b26c
LM
172 for (i = 0; i < n; i++) {
173 ret += get_tab (stack, i + 1);
a24bd519
LM
174 }
175 return ret;
176}
177
178double variance ()
179{
180 double ret = 0;
3559b26c
LM
181 int i, n = size_tab (stack);
182 if (n < 2) {
183 VERBOSE (WARNING, fprintf (stdout, "error not enough element in stack (%d)\n", n));
a24bd519
LM
184 return 0;
185 }
3559b26c
LM
186 double m = mean ();
187 for (i = 0; i < n; i++) {
188 double x = get_tab (stack, i + 1);
189 ret += (x - m) * (x - m);
a24bd519 190 }
3559b26c 191 return ret / n;
a24bd519
LM
192}
193
194/* vim: set ts=4 sw=4 et: */