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


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. CentOS 7安装Azcopy

    Azcopy是Azure存储一个非常好用的工具.本文将介绍如何在CentOS7下安装的过程. 更新:目前需要.net core 2.0版本.具体下载地址大家自己搜索. 1 安装.net core 1. ...

  2. [转载]Ubuntu下ssh服务的安装与登陆(ssh远程登陆)

    转载地址:http://blog.csdn.net/zht666/article/details/9340633 Ubuntu默认并没有安装ssh服务,如果通过ssh远程连接到Ubuntu,需要自己手 ...

  3. uptime命令查看系统启动时间和运行时间、查看linux系统负载

    1.uptime命令输出:16:11:40 up 59 days, 4:21, 2 users, load average: 0.00, 0.01, 0.00 2.查看/proc/uptime文件计算 ...

  4. 分布式代码管理github

    Git是世界上最先进的分布式版本的控制系统,特点是:简单大气上档次. Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了.

  5. web基础 (二) html标签

    一.html是什么? 超文本标记语言(Hypertext Markup Language,HTML)通过标签语言来标记要显示的网页中的各个部分.一套规则,浏览器认识的规则 浏览器按顺序渲染网页文件,然 ...

  6. python中匹配中文,解决不匹配,乱码等问题

    UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 0: ordinal 字符串前加 ur‘str’即可;

  7. paramiko 模块封装

    #!/usr/bin/env python#coding=utf-8 import paramiko, getpass,sys,traceback class ssh_utils(): def log ...

  8. 跨数据文件删除flashback database

    Oracle flashback database的使用有一些限制,其中最主要的是flashback database不支持跨数据文件删除闪回和不支持跨数据文件shrink闪回.对于已经删除的数据文件 ...

  9. When install ”matplotlib” with ”pip”, if you get the following error, it means the “freetype” and “png” libraries needed by matplotlib are not installed:

    ============================================================================ * The following require ...

  10. 部署和调优 1.3 pureftp部署和优化-2

    登录ftp,用远程的一台机器,执行 lftp 如果没有这个命令,需要安装 yum install -y lftp 登录ftp lftp ftpuser1@192.168.1.117 输入口令,即密码 ...