一.栈和队列综合(算法)


1.判断单链表(带头结点)的结点值(字符型)是否中心对称

 1 bool IsSymmetry( LinkList& L )
2 {
3 char S[MAXSIZE];
4 int top = -1, len = 0, i;
5 LinkList p;
6 p = L->next;
7 while ( p ) { p = p->next; len++; }
8 p = L->next;
9 for (i=0;i<len/2;i++)
10 {
11 S[++top] = p->data;
12 p = p->next;
13 }
14 i--;
15 if ( len % 2 )
16 p = p->next;
17 while ( top != -1 )
18 {
19 if ( p->data != S[top] )
20 return false;
21 top--;
22 p = p->next;
23 }
24 return true;
25 }

2.共享栈由两个顺序栈S1,S2构成,总大小为100,请设计S1,S2入栈,出栈的算法

 1 #define MAXSIZE 100
2 ElemType S[MAXSIZE];
3 int top[2] = { -1,MAXSIZE };
4 bool Push( int i, ElemType x )
5 {
6 if ( i < 0 || i>1 || top[1] - top[0] == 1 )
7 return false;
8 if ( i == 0 ) S[++top[0]] = x;
9 else S[--top[1]] = x;
10 return true;
11 }
12
13 bool Pop( int i, ElemType x )
14 {
15 if ( i < 0 || i>1
16 || ( i == 0 && top[0] == -1 )
17 || ( i == 1 && top[1] == MAXSIZE ) )
18 return false;
19 if ( i == 0 ) x = S[top[0]--];
20 else x = S[top[1]++];
21 return true;
22 }

3.如果希望循环队列中的元素都能得到利用,则需设置一个标志域tag,并以tag的值为0或1来区分队头指针front和队尾rear相同时的队列状态是"空"还是"满",编写与此结构相应的入队和出队算法

 1 ElemType Q[MAXSIZE];
2 int front = -1, rear = -1;
3 // 队空条件: front==rear&&tag==0
4 // 队满条件: front==rear&&tag==1
5 // 进队操作: rear=(rear+1)%MAXSIZE;
6 // Q[rear]=x;
7 // tag=1;
8 // 出队操作: front=(front+1)%MAXSIZE;
9 // x=Q[front];
10 // tag=0;
11
12 // 1)"tag"法循环队列入队算法
13 bool EnQueue( ElemType x )
14 {
15 if ( front == rear && tag == 1 )
16 return false;
17 rear = ( rear + 1 ) % MAXSIZE;
18 Q[rear] = x;
19 tag = 1;
20 return true;
21 }
22
23 // 2)"tag"法循环队列出队算法
24 bool DeQueue( ElemType& x )
25 {
26 if ( front == rear && tag == 0 )
27 return false;
28 front = ( front + 1 ) % MAXSIZE;
29 x = Q[front];
30 tag = 0;
31 return true;
32 }

4.Q是一个队列,S是一个空栈,实现将队列中的元素逆置的算法

 1 ElemType S[MAXSIZE], Q[MAXSIZE];
2 int top = -1, front = -1, rear = -1;
3 void Inverse(ElemType S[], ElemType Q[])
4 {
5 ElemType x;
6 while ( front != rear )
7 {
8 x = Q[++front];
9 S[++top] = x;
10 }
11 while ( top != -1 )
12 {
13 x = S[top--];
14 Q[++rear] = x;
15 }
16 }

5.利用两个栈S1,S2模拟一个队列,已知栈的4个运算如下:

 1 // 已知:
2 void Push(Stack& S, ElemType x);
3 void Pop(Stack& S, ElemType& x)
4 bool IsEmpty(Stack& S);
5 bool IsOverflow( Stack& S );
6
7 bool EnQueue( Stack& S1, Stack& S2, ElemType x )
8 {
9 if ( !IsOverflow( S1 ) )
10 {
11 Push( S1, x );
12 return true;
13 }
14 if ( !IsEmpty( S2 ) )
15 return false;
16 while (!IsEmpty(S1))
17 {
18 Pop( S1, t );
19 Push( S2, t );
20 }
21 Push( S1, x );
22 return true;
23 }
24
25 bool DeQueue( Stack& S1, Stack& S2, ElemType& x )
26 {
27 if (!IsEmpty(S2))
28 {
29 Pop( S2, x ); return true;
30 }
31 if ( IsEmpty( S1 ) )
32 return false;
33 while (!IsEmpty(S1))
34 {
35 Pop( S1, t );
36 Push( S2, t );
37 }
38 Pop( S2, x );
39 return true;
40 }
41
42 bool IsEmpty( Stack& S1, Stack& S2 )
43 {
44 if ( IsEmpty( S1 ) && IsEmpty( S2 ) )
45 return true;
46 return false;
47 }

6.括号匹配问题:判别表达式中括号是否匹配(只含有$(),[],\{\}$)

 1 bool IsBracketMatch( char*str )
2 {
3 char S[MAXSIZE];
4 int top = -1;
5 for ( int i = 0; str[i]; i++ )
6 {
7 char c = str[i];
8 switch ( c )
9 {
10 case '(':
11 case '[':
12 case '{':
13 S[++top] = c;
14 break;
15 case ')':
16 c = S[top--];
17 if ( c != '(' )return false;
18 break;
19 case ']':
20 c = S[top--];
21 if ( c != '[' )return false;
22 break;
23 case '}':
24 c = S[top--];
25 if ( c != '{' )return false;
26 break;
27 default:
28 break;
29 }
30 }
31 return top == -1;
32 }

7.利用栈实现以下递归函数的非递归计算:

$$P_{n}(x)=
\cases{
1 & n=0\cr
2x & n=1\cr
2x\cdot{P_{n-1}(x)}-2(n-1)\cdot{P_{n-2}(x)} & n>1
}$$

 1 double P( int n, double x )
2 {
3 struct Stack
4 {
5 int n; // 层
6 double val; // 数值结果
7 }S[MAXSIZE];
8 int top = -1, fv1 = 1, fv2 = 2 * x;
9 for ( int i = n; i > 1; i-- )
10 S[++top].n = i;
11 while ( top != -1 )
12 {
13 S[top].val = 2 * x*fv2 - 2 * ( S[top].n - 1 )*fv1;
14 fv1 = fv2;
15 fv2 = S[top--].val;
16 }
17 if ( n == 0 ) return fv1;
18 return fv2;
19 }

[Algorithm]栈和队列的更多相关文章

  1. Algorithm --> 两个栈实现队列和两个队列实现栈

    两个栈实现队列和两个队列实现栈 队列(queue)先进先出的线性表:栈(stack)先进后出的线性表. 两个栈实现队列 法一思路: s1是入栈的,s2是出栈的. 入队列:直接压入s1即可: 出队列:如 ...

  2. YTU 3002: 出栈顺序(栈和队列)

    3002: 出栈顺序(栈和队列) 时间限制: 1 Sec  内存限制: 128 MB 提交: 80  解决: 20 题目描述 给出一个入栈序列,和一个出栈序列,判断该出栈序列是否正确. 输入 输入包含 ...

  3. YTU 3006: 迷宫问题(栈与队列)

    3006: 迷宫问题(栈与队列) 时间限制: 1 Sec  内存限制: 128 MB 提交: 3  解决: 1 题目描述 编写一个求解迷宫问题的程序,要求输出迷宫的所有路径,并求最短路径长度及最短路径 ...

  4. SDOTOJ2088 refresh的停车场(栈和队列)

     refresh的停车场 Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Submit S ...

  5. refresh的停车场(栈和队列的STL)

    refresh的停车场 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描写叙述  refresh近期发了一笔横財,开了一家停车场. 因 ...

  6. C++标准模板库STL算法与自适应容器(栈和队列)

    参考<21天学通C++>第23与第24章节,对STL算法与自适应容器进行介绍. 实际上在前面的STL顺序容器.关联容器进行介绍时或多或少引用到了一些STL算法中的模板函数.而自适应容器是在 ...

  7. 算法入门 - 基于动态数组的栈和队列(Java版本)

    之前我们学习了动态数组的实现,接下来我们用它来实现两种数据结构--栈和队列.首先,我们先来看一下栈. 什么是栈? 栈是计算机的一种数据结构,它可以临时存储数据.那么它跟数组有何区别呢? 我们知道,在数 ...

  8. 学习javascript数据结构(一)——栈和队列

    前言 只要你不计较得失,人生还有什么不能想法子克服的. 原文地址:学习javascript数据结构(一)--栈和队列 博主博客地址:Damonare的个人博客 几乎所有的编程语言都原生支持数组类型,因 ...

  9. [ACM训练] 算法初级 之 数据结构 之 栈stack+队列queue (基础+进阶+POJ 1338+2442+1442)

    再次面对像栈和队列这样的相当基础的数据结构的学习,应该从多个方面,多维度去学习. 首先,这两个数据结构都是比较常用的,在标准库中都有对应的结构能够直接使用,所以第一个阶段应该是先学习直接来使用,下一个 ...

随机推荐

  1. 第一篇 PHP开发环境搭建以及多站点配置(基于windows 7系统)

    从今天开始,我将用PHP开发一些小的网站,大家知道LAMP(Linux)组合的优势,使PHP受到广大中小企业的喜欢.使PHP与JAVA,ASP三分天下,PHP具有跨平台性,所以在windows一样是可 ...

  2. What makes an inferred latch? how To avoid creating inferred latches? when do you know you need latches?

    What makes an inferred latch?For combinatorial logic, the output of the circuit is a function of inp ...

  3. JSP/java 执行创建批处理文件,并执行批处理事务。

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) { InputStream in = null; Inpu ...

  4. Thread之一:线程生命周期及五种状态

    <Thread之一:线程生命周期及五种状态> <juc线程池原理(四): 线程池状态介绍> 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较 ...

  5. Py修行路 Pandas 模块基本用法

    pandas 安装方法:pip3 install pandas pandas是一个强大的Python数据分析的工具包,它是基于NumPy构建的模块. pandas的主要功能: 具备对其功能的数据结构D ...

  6. sqlplus 设置显示格式

    使用sqlplus查询显示结果,显示很乱,下面有种方法可以让她显示的更好看些.1.设置显示的宽度:设置前可以先查看当前宽度: SQL> show linesize;linesize 100SQL ...

  7. javascript的概述

    JavaScript是怎么诞生的???刚开始的是为了验证表单而开发出来的. 什么是JavaScript???a.面向对象的编程语言b.解释性的编程语言(说白了就是不用编译的一种语言)c.脚本语言(说白 ...

  8. this、new、call和apply的相关问题

    讲解this指针的原理是个很复杂的问题,如果我们从javascript里this的实现机制来说明this,很多朋友可能会越来越糊涂,因此本篇打算换一个思路从应用的角度来讲解this指针,从这个角度理解 ...

  9. 第二部分 实习操作课程 第一节 ArcGIS Online的基本功能

  10. day35-hibernate映射 03-Hibernate持久态对象自动更新数据库

    持久态对象一个非常重要的能力:自动更新数据库. package cn.itcast.hibernate3.demo1; import static org.junit.Assert.*; import ...