- 栈(stack)
- 栈(stack)是限定仅在表尾进行插入或删除操作的线性表。因此,对栈来说,表尾端有特殊含义,称为栈顶(top),相应地,表头端称为栈底(bottom)。不含元素的空表称为空栈。
- 栈的特点:栈的修改是按后进先出的原则进行的。因此,栈又称为后进先出(last in first out)的线性表(LIFO)。
- 栈的基本操作:在栈顶进行插入或删除,栈的初始化、判空及取栈顶元素等。
//栈的基本方法-构造一个存储字符元素的栈 即stack.h头文件 #include<stdio.h> #include<stdlib.h> #define INITSIZE 100 #define INCRSIZE 10 #define ERROR 0 #define OK 1 typedef int Status; typedef struct {//构造栈 char *base; char *top; int size; } SqStack; Status InitStack(SqStack *s) {//初始化栈 s->base = (char *)malloc(INITSIZE * sizeof(char)); if (!s->base) return ERROR; s->top = s->base; s->size = INITSIZE; return OK; } Status ClearStack(SqStack *s) {//清空栈 s->top = s->base; } Status StackEmpty(SqStack *s) {//判空 if (s->top == s->base) return 1; else return 0; } int StackLength(SqStack (*s) {//获取栈的长度 return s->top - s->base ; } Status GetTop(SqStack s, char *e) {//获取栈顶元素 if (s.top == s.base) return ERROR; *e = *(s.top - 1); return OK; } Stack Push(SqStack *s, char e) {//压栈 if (s->top - s->base >= s->size) { s->base = (char *)realloc(s->base, (s->size + INCRSIZE)*sizeof(char)); if (!s->base) exit(1); s->top = s->base + s->size; s->size += INCRSIZE; } *(s->top) = e; s->top ++; return OK; } Status Pop(SqStack *s, char *e) {//弹出元素 if (s->top == s->base) return ERROR; *e = *(--s->top); return OK; } void StackTraverse(SqStack *s) {//打印栈中元素,栈顶->栈底 if (!s->base) exit(1); char *t = s->top - 1; while(t >= s->base) { printf("%c", *t); t--; } }
//c++栈的基本方法 #include<iostream> using namespace std; #define starksize 100 typedef struct{ char *base; char *top; int length ; }StarkTR typedef struct{ int *base; int *top; int length ; }StarkND; //寄存操作数 int InitTR(StarkTR &L){ //初始化寄存operater栈 L.base = new char[starksize]; L.top = L.base; L.length = starksize; return 1; } int PushTR(StarkTR &L,char e){ //入栈 if(L.top - L.base == L.length){ cout<<"栈满!"; return 0; } *L.top++ = e; return 1; } char PopTR(StarkTR &L,char &e){ //出栈 if(L.top - L.base == 0){ cout<<"栈空!"; return 0; } e = *--L.top; return 1; } char GetTopTR(StarkTR L){ //取栈顶元素 字符 if(L.top != L.base) return *(L.top -1); } int GetTopND(StarkND L){ //取栈顶元素 数值 if(L.top != L.base) return *(L.top -1); }
- 队列(queue)
- 队列(queue)和栈相反,是一种先进先出(first in first out,FIFO)的线性表。它允许在表的一端进行插入,而在另一端删除元素。这和我们生活中的排队是一致的,最早进入队列的元素最早离开。在队列中,允许插入的一端叫做队尾(rear),允许删除的一端则称为队头(front)。
- 队列的基本操作:初始化空队列、清空队列、判空、获取队列的长度、获取队头元素、插入队尾元素、删除队头元素、visit()从队头到队尾遍历等。