-
Notifications
You must be signed in to change notification settings - Fork 0
/
stack_ll.c
74 lines (67 loc) · 1.52 KB
/
stack_ll.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
// #include "stack_ll.h"
#include "stackDef.h"
#include "Nlinkedlist.h"
#include "grammar.h"
#include "lexer.h"
#include <stdio.h>
#include <stdlib.h>
Stack* newStack()
{
Stack* mainStack = (Stack*) malloc(sizeof(Stack));
mainStack->list1 = createNewList();
return mainStack;
}
void push(Stack* mainStack, NODE element)
{
// printNT(element->val.nt_val);
LIST temp = mainStack->list1;
insertNodeIntoList(element, temp);
}
NODE top(Stack* mainStack)
{
LIST ll = mainStack->list1;
NODE temp = ll->head;
return temp;
}
void pop(Stack* mainStack)
{
LIST ll = mainStack->list1;
removeFirst(ll);
}
int reachEnd(Stack* mainStack)
{
if(mainStack->list1->count == 0) return 0;
else return 1;
}
void printStack(Stack* mainStack)
{
LIST stack = mainStack->list1;
printList(stack);
}
void pushDerivation(Stack* mainStack, RULE rhs)
{
// printRule(rhs);
// LIST list = duplicateRuleIntoList(rhs);
// fflush(stdout);
// pop(mainStack);
NODE rhsptr = rhs->head->next;
NODE dup;
// printList(list);
Stack* temp = newStack();
while(rhsptr != NULL)
{
dup = duplicateNode(rhsptr);
push(temp, dup);
// printStack(temp);
rhsptr = rhsptr->next;
}
// temp->list1->head = rhsptr;
// printf("\nTemp Stack:\n");
// printStack(temp);
while(reachEnd(temp))
{
NODE ins = top(temp);
pop(temp);
push(mainStack, ins);
}
}