2023数据结构考研复习-栈队列和数组

Posted ZSYL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2023数据结构考研复习-栈队列和数组相关的知识,希望对你有一定的参考价值。

2023数据结构考研复习-栈、队列和数组(二)

前言

数据结构考研复习过程中记录部分代码学习,由于考研复习时间紧凑,就没有详细写注释跟笔记,请谅解。

2023考研必胜!

用声明的方式创建栈,没有使用malloc,函数运行结束后会自动回收内存。

栈区:由编译器自动分配释放,存放函数的参数值,局部变量等

顺序栈

#include <iostream>
using namespace std;

#define Maxsize 10

struct Stack 
    int data[Maxsize];
    int top;
;
void init (Stack* s) 
    s->top = -1;

bool empty (Stack *S) 
    return S->top == -1;

bool push (Stack &S, int x) 
    if (S.top == Maxsize-1)
        return 0;
    S.data[++S.top] = x;
    return 1;

bool pop (Stack &S, int &x) 
    if (S.top == -1)
        return 0;
    x = S.data[S.top--];
    return 1;

bool top (Stack S, int &x) 
     if (S.top == -1)
        return 0;
    x = S.data[S.top];
    return 1;

int main() 
    Stack s;
    Stack *ss = &s;
    init(ss);
    cout << empty(ss) << endl;
    cout << ss->top << endl;

共享栈

#include <iostream>
using namespace std;

#define Maxsize 10

// 共享栈
struct Stack 
    int data[Maxsize];
    int top0;
    int top1;
;
void init (Stack& s) 
    s.top0 = -1;
    s.top1 = Maxsize;

bool empty (Stack S) 
    return S.top0+1 == S.top1;

bool push (Stack &S, int x, int i) 
	if (i != 0 || i != 1)
		return false;
    if (S.top1 - S.top0 == 1)
        return 0;
    
    switch(i)
		case 0: S.data[++s.top0] = x; return 1; break;
		case 1: S.data[--s.top1] = x; return 1;
	

bool pop (Stack &S, int &x, int i) 
	if (i != 0 || i != 1)
		return false;
    switch(i)
		case 0: 
			if (S.top0 == -1)
				return 0;
			else
				return S.data[s.top0--];
			 break;
		case 1: 
			if (S.top1 == Maxsize)
				return 0;
			else
				return S.data[s.top1++];
			 break;
	

bool top (Stack S, int &x, int i) 
 	switch(i)
		case 0: return S.data[s.top0]; break;
		case 1: return S.data[s.top1]; break;
	

    return -1;

int main() 
    Stack s;
    init(s);
    cout << empty(s) << endl;
    cout << s.top << endl;

括号匹配

#include <iostream>
using namespace std;

#define Maxsize 10
char c[10010];
int top = -1;

bool bracketCheck (char str[], int length) 
    for (int i = 0; str[i] != '\\0'; i++) 
        if (str[i] == '(' || str[i] == '[' || str[i] == '') 
            c[++top] = str[i]; 
         else 
            if (top < 0)
                return false;
            char t = c[top--];
            if (str[i] == ')' && t != '(')
                return false;
            if (str[i] == ']' && t != '[')
                return false;
            if (str[i] == '' && t != '')
                return false;
        
    
    return top == -1;

int main() 
    char c[] = "[]";
    cout << bracketCheck(c, sizeof(c)) << endl;

函数调用

特点:最后被调用的函数最先执行结束(LIFO)

需要一个栈存储:

  • 调用返回地址
  • 实参
  • 局部变量

进制转换

public static void conversion(int N, int r) 
      Stack<Integer> stack = new Stack<>();
      while (N != 0) 
          stack.push(N % r);
          N = N / r;
      
      System.out.println("进制转化结果是:");
      while(!stack.empty()) 
          System.out.print(stack.pop());
      
  

队列

顺序存储

#include <iostream>
using namespace std;

#define Maxsize 10

struct Queue 
    int data[Maxsize];
    int front, rear;
    int size = 0;  // 当前长度,即便队满队空都指向同一个位置
    int flag = 0;  // 删除都置为0,插入都置为1,因此队满条件: front == rear && tag == 1
;
void init (Queue* s) 
    s->rear = 0;
    s->front = 0;

bool empty (Queue *S) 
    return S->rear == S->front;

bool add (Queue &S, int x) 
    // 判断队满
    if ((S.rear+1) % Maxsize == S.front)
        return 0;
    S.data[S.rear] = x;
    S.rear = (S.rear + 1) % Maxsize;
    return 1;

bool pop (Queue &S, int &x) 
    if (S.rear == S.front)  // 判断队空
        return 0;
    x = S.data[S.front];
    S.front = (S.front + 1) % Maxsize;
    return 1;

bool top (Queue S, int &x) 
    if (S.rear == S.front)  // 判断队空
        return 0;
    x = S.data[S.front];
    return 1;

int length (Queue S) 
    return (S.rear + Maxsize - S.front) % Maxsize;


int main() 
    Queue s;
    Queue *ss = &s;
    init(ss);
    cout << empty(ss) << endl;
    cout << ss->top << endl;

链式存储

#include <iostream>
using namespace std;

#define Maxsize 10

struct Node 
    int data;
    Node *next;
;
struct Queue 
    Node *front, *rear;
    int size = 0;  // 当前长度,即便队满队空都指向同一个位置
    int flag = 0;  // 删除都置为0,插入都置为1,因此队满条件: front == rear && tag == 1
;
void init (Queue &Q) 
    Q.rear = Q.front = new Node;
    Q.front->next = NULL;

bool empty (Queue *Q) 
    return Q->front == Q->rear || Q->front->next == NULL;
 
bool add (Queue &Q, int x) 
    Node *s = new Node;
    s->data = x;
    s->next = NULL;
    Q.rear->next = s;
    Q.rear = s;  // 修改表尾指针

    return 1;

bool pop (Queue &S, int &x) 
    if (S.rear == S.front)  // 判断队空  不带头结点:S.front == NULL
        return 0;
    Node *p = S.front->next;
    x = p->data;
    S.front->next = p->next;
    if (S.rear == p)  // 最后一个元素出队
        S.rear = S.front;
    delete p;
    p = NULL;
    return 1;

bool top (Queue &S, int &x) 
    if (S.rear == S.front)  // 判断队空
        return 0;
    x = S.front->next->data;
    return 1;


int main() 
    Queue s;
    init(s);
    cout << s->front->next << endl;

稀疏矩阵

//采用三元组结构的系数矩阵
public class Triple 
	public int x;
	public int y;
	private double value;
	
	//构造三元组
	public Triple(int x, int y, double data) 
		this.x = x;
		this.y = y;
		this.value = data;
	
	
	public double getData() 
		return value;
	
	


//定义稀疏矩阵
class  SparseMatrix 
	public Triple[] datas; //三元组表
	
	//构造三元组的稀疏矩阵
	//参数rows,cols表示稀疏的总行数, length 表示矩阵中非零元素的个数
	public SparseMatrix(int rows, int cols, int length) 
		if(length < 1)
			datas = new Triple[1]; //构建空的稀疏矩阵
			datas[0] = new Triple(0, 0, 0);
			
		 else 
			datas = new Triple[length+1]; //构建非空稀疏矩阵
			datas[0] = new Triple(rows, cols, length); 
			
		
	

综合应用

1. 合法IO

03.假设以Ⅰ和О分别表示入栈和出栈操作。栈的初态和终态均为空,入栈和出栈的操作序列可表示为仅由Ⅰ和О组成的序列,可以操作的序列称为合法序列,否则称为非法序列.

写出一个算法,判定所给的操作序列是否合法。若合法,返回true,否则返回false(假定被判定的操作序列已存入一维数组中)。

bool Judge(char a[]) 
    int cnt = 0, i = 0;
    while (a[i] != '/0') 
        if (a[i] == 'I')
            cnt++;
        else
            cnt--;
    
    if (cnt == 0)
        return 1;
    else 
        return 0;

2. 中心对称

04.设单链表的表头指针为L,结点结构由data和next两个域构成,其中data域为字符型。

试设计算法判断该链表的全部n个字符是否中心对称。例如xyx、xyyx都是中心对称。

算法思想:使用栈来判断链表中的数据是否中心对称。让链表的前一半元素依次进栈。在处理链表的后一半元素时,当访问到链表的一个元素后,就从栈中弹出一个元素,两个元素比较,若相等,则将链表中的下一个元素与栈中再弹出的元素比较,直至链表到尾。这时若栈是空栈,则得出链表中心对称的结论;否则,当链表中的一个元素与栈中弹出元素不等时,结论为链表非中心对称。

int dc(LinkList L, int n) 
    int i;
    char s[n/2];
    p = L->next;
    for (i = 0; i < n/2; i++) 
        s[i] = p->data;
        p = p->next;
    
    if ((i & 1) == 1)
        p = p->next;
    i--;
    while (p && s[i] == p->data) 
        i--;
        p = p->next;
    
    if (i == -1)
        return 1;
    else 
        return 0;

3. 共享栈

05.设有两个栈s1、s2都采用顺序栈方式,并共享一个存储区〔0, … maxsize-1],为了尽量利用空间,减少溢出的可能,可采用栈顶相向、迎面增长的存储方式。试设计s1、s2有关入栈和出栈的操作算法。.

两个栈共享向量空间,将两个栈的栈底设在向量两端,初始时,s1栈顶指针为-1,s2栈顶指针为maxsize。两个栈顶指针相邻时为栈满。两个栈顶相向、迎面增长,栈顶指针指向栈顶元素。

using namespace std;

#define Maxsize 10

// 共享栈
struct Stack 
    int data[Maxsize];
    int top0;
    int top1;
;
void init (Stack& s) 
    s.top0 = -1;
    s.top1 = Maxsize;

入栈操作:

bool push (Stack &S, int x, int i) 
	if (i != 0 || i != 1)
		return false;
    if (S.top1 - S.top0 == 1)
        return 0;
    
    switch(i)
		case 0: S.data[++s.top0] = x; return 1; break;
		case 1: S.data[--s

以上是关于2023数据结构考研复习-栈队列和数组的主要内容,如果未能解决你的问题,请参考以下文章

第2章第2节练习题3 使用队列模拟渡口管理

2023数据结构考研复习-排序

2023数据结构考研复习-排序

2023数据结构考研复习-图

2023数据结构考研复习-图

考研数据结构模板:顺序表链表栈队列