栈——栈的链式存储结构的设计思路与实现

 

 

总的实现代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAXSIZE 100
typedef char string[MAXSIZE];

typedef struct stu{
	string name;
	string id;
}ElemType;

typedef struct _stack{
	ElemType* data;
	int size;
	int maxSize;
}STACK;

// 链表节点
typedef struct Node {
    ElemType data;
    struct Node* next;
}Node;

// 栈结构
typedef struct {
    Node* Head;
    int Size;
}Stack;

// 初始化栈
void InitStack(Stack* stack)
{
	stack->Head = (Node *)malloc(sizeof(Node));
	if(stack->Head == NULL)
	    return;
	stack->Head->next = NULL;
	stack->Size = 0; 
}

// 判断栈是否为空
bool Empty(Stack* stack) 
{
    return stack->Size == 0;
}

// 入栈
void Push(Stack* stack, ElemType item) 
{
    Node *newNode = (Node *)malloc(sizeof(Node));
    if (newNode == NULL) 
	{
        return;
    }
    newNode->data = item;
    newNode->next = stack->Head->next;
    stack->Head->next = newNode;
    ++stack->Size;
}

// 出栈
int Pop(Stack* stack) 
{
    if (Empty(stack)) 
	{
        return -1; // 或者其他错误值
    }
    Node* temp = stack->Head->next;
    stack->Head->next = temp->next;
    stack->Size--;
    free(temp);
    return 1;
}

// 查看栈顶元素
ElemType* Top(Stack* stack) 
{
    if (Empty(stack)) 
	{
        return NULL; // 或者其他错误值
    }
    return &(stack->Head->next->data);
}

int Size(Stack *stack)
{
	return stack->Size;
 } 
 
void Free(Stack *stack)
{
	while(stack->Size)
	{
		Pop(stack);
	}
	free(stack->Head);
	stack->Head = NULL;
}

int main() 
{
    Stack stack;
    InitStack(&stack);
    ElemType arr[20] = {
	    {"张三", "0x001"},
	    {"李四", "0x002"}
	};
    Push(&stack, arr[0]);
    Push(&stack, arr[1]);
    
    ElemType e = *(Top(&stack));
    printf("栈顶元素为:%s  %s\n", e.name, e.id);
    printf("栈中元素个数为:%d\n", Size(&stack)); 
    
    Pop(&stack);
    printf("栈中元素个数为:%d\n", Size(&stack));
    e = *(Top(&stack));
    printf("栈顶元素为:%s  %s\n", e.name, e.id);
    
    if(Empty(&stack))
	{
		printf("栈空\n");
    }
    else
    {
    	printf("栈非空\n");
	}
    Free(&stack);
    return 0;
}

 

请登录后发表评论

    没有回复内容