棧(stack)又名堆棧,它是一種運算受限的線性表。限定僅在表尾進行插入和删除操作的線性表。這一端被稱為棧頂,相對地,把另一端稱為棧底。向一個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個棧删除元素又稱作出棧或退棧,它是把棧頂元素删除掉,使其相鄰的元素成為新的棧頂元素。
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* next;
}Node;
//初始化棧
Node* initStack() {
Node* S = (Node*)malloc(sizeof(Node));
S->data = 0;
S->next = NULL;
return S;
}
//判斷棧空
int isEmpty(Node* S) {
if (S->data == 0 || S->next == NULL) {
return 1;
}
else {
return 0;
}
}
//讀棧頂元素
int getTop(Node* S) {
if (isEmpty(S)) {
return -1;
}
else {
return S->next->data;
}
}
//入棧
void push(Node* S, int data) {
Node* node = (Node*)malloc(sizeof(Node));
node->data = data;
node->next = S->next;
S->next = node;
S->data++;
}
//出棧
int pop(Node* S) {
if (isEmpty(S)) {
return -1;
}
else {
Node* node = S->next;
int data = node->data;
S->next = node->next;
free(node);
return data;
}
}
//周遊
void printStack(Node* S) {
Node* node = S->next;
while (node)
{
printf("%d->", node->data);
node = node->next;
}
printf("NULL\n");
}
int main() {
Node* S = initStack();
push(S, 1);
push(S, 2);
push(S, 3);
push(S, 4);
printStack(S);
int i = pop(S);
printf("current elem=%d\n", i);
printStack(S);
return 0;
}