correct push
[calc.git] / stack.c
... / ...
CommitLineData
1#include <math.h>
2#include <stdio.h>
3
4#include "debug.h"
5#include "format.h"
6#include "parser.h"
7#include "tabular.h"
8
9#include "stack.h"
10
11/* global variables */
12
13tab_t * stack = NULL;
14
15/* stack management */
16
17double get (int n)
18{
19 return get_tab (stack, n);
20}
21
22double length ()
23{
24 return size_tab (stack);
25}
26
27double pop ()
28{
29 return pop_tab (stack, -1);
30}
31
32double push (double val)
33{
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;
42}
43
44double put (int n, double val)
45{
46 if (n > size_tab (stack)) {
47 stack = resize_tab (stack, n);
48 }
49 return set_tab (stack, n, val);
50}
51
52double set (int nbops, element_t **ops)
53{
54 int i;
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);
60}
61
62void show (void)
63{
64 int i, n = size_tab (stack);
65 fprintf (stdout, "stack:");
66 for (i = 0; i < n; i++) {
67 fprintf (stdout, " ");
68 fprintf (stdout, minform, get_tab (stack, i + 1));
69 }
70 fprintf (stdout, "\n");
71}
72
73/* stack functions */
74
75double max ()
76{
77 double ret = 0;
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));
81 return 0;
82 }
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;
88 }
89 }
90 return ret;
91}
92
93double mean ()
94{
95 double ret = 0;
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));
99 return 0;
100 }
101 for (i = 0; i < n; i++) {
102 ret += get_tab (stack, i + 1);
103 }
104 return ret / n;
105}
106
107double min ()
108{
109 double ret = 0;
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));
113 return 0;
114 }
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;
120 }
121 }
122 return ret;
123}
124
125void order ()
126{
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);
132 }
133}
134
135double median ()
136{
137 double ret = 0;
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);
146 }
147 return ret;
148}
149
150double prod ()
151{
152 double ret = 1;
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));
156 return 0;
157 }
158 for (i = 0; i < n; i++) {
159 ret *= get_tab (stack, i + 1);
160 }
161 return ret;
162}
163
164double sum ()
165{
166 double ret = 0;
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));
170 return 0;
171 }
172 for (i = 0; i < n; i++) {
173 ret += get_tab (stack, i + 1);
174 }
175 return ret;
176}
177
178double variance ()
179{
180 double ret = 0;
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));
184 return 0;
185 }
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);
190 }
191 return ret / n;
192}
193
194/* vim: set ts=4 sw=4 et: */