Introduction to Stacks
Published: 2024-04-10 15:05:17

## What are Stacks?

A `Stack` is a Linear Data Structure that follows a process of `FILO` or First In - Last Out. 

To understand how a stack works, you can think of it as a pile of plates. If you were to add a plate, you would add it to the top of the pile, and if you were to remove a plate, you can only remove the top plate. 

We will be using an array called `stack` for the demonstration and a variable `top` initialized as `-1` to indicate an `empty stack` and let us assume that the `stack` has to be of `size 5`. The various operations that can be performed on a stack are:

### Push
The `push` operation `adds` the value to the `top of the stack`. If the `top` value is the `same` as the `size of the stack`, if a push operation is attempted, it will lead to `Stack Overflow` indicating that you're trying to add a value past the allocated space. The function for the push operation:

```py
def push():
    #let us assume the stack to be of size 5
    global top
    global stack 
    
# value from 0 to size-1, as top begins from -1
    if(top == 4):  
        print("Stack Overflow")
    else:
        a = int(input("Enter value"))
        stack.append(a)
        top+=1
        print(f"{a} pushed to stack")
```

### Pop
The `pop` operation `removes` the value at the `top of the stack`. If the value of `top` is `-1` (ie, the stack is empty) and the pop operation is attempted, it will lead to `Stack Underflow` indicating that you're trying to remove a value from an empty stack. The function for the pop operation:

```py
def pop():
    global top
    global stack 
       
    if(top == -1):
        print("Stack Underflow")
    else:
        print(f"{stack[top]} has been popped")
        stack.pop(top)
        top -= 1
```

### Peek
The Peek Operation displays the value at the top of the stack. The function for the peek operation is:

```py
def peek():
    global top
    global stack 
    
    if(top == -1):
        print("Stack is empty")
    else:
        print(f"Top: {stack[top]}")
        
```

### State of Stack
This function combines the three operations `is_empty()` which tells you whether or not the stack is empty, `is_full()` which tells you whether or not the stack is full. The function for the operation is:

```py
def state_of_stack():
    if(top==4):
        print("Stack is full")
    elif(top == -1):
        print("Stack is empty")
    else:
        print("Stack is partially empty")
```


![Stack Process](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zxy15hxwf2n059pzoei5.png)


To simulate the functioning of the stack, the complete code is given below

```py
import array as ar

## Global variables

stack = ar.array('i', [])
top = -1


def push():
    global top
    global stack 
   
    if(top == 4):
        print("Stack Overflow")
    else:
        a = int(input("Enter value"))
        stack.append(a)
        top+=1
        print(f"{a} pushed to stack")


def pop():
    global top
    global stack 
       
    if(top == -1):
        print("Stack Underflow")
    else:
        print(f"{stack[top]} has been popped")
        stack.pop(top)
        top -= 1
        
        
def peek():
    global top
    global stack 
    
    if(top == -1):
        print("Stack is empty")
    else:
        print(f"Top: {stack[top]}")
        

def state_of_stack():
    if(top==4):
        print("Stack is full")
    elif(top == -1):
        print("Stack is empty")
    else:
        print("Stack is partially empty")
        
        
## Driver Code
while(True):
    print("1.Push\n2.Pop\n3.Peek\n4.State of Stack\n5.Exit")

    ch = int(input())

    if(ch==1):
        push()
    elif(ch==2):
        pop()
    elif(ch==3):
        peek()
    elif(ch==4):
        state_of_stack()
    else:
        break
```

### Note 
Since we will be modifying the stack in the functions, we use the global value to modify the variables that are being used