[Algorithm]栈和队列
一.栈和队列综合(算法)
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]栈和队列的更多相关文章
- Algorithm --> 两个栈实现队列和两个队列实现栈
两个栈实现队列和两个队列实现栈 队列(queue)先进先出的线性表:栈(stack)先进后出的线性表. 两个栈实现队列 法一思路: s1是入栈的,s2是出栈的. 入队列:直接压入s1即可: 出队列:如 ...
- YTU 3002: 出栈顺序(栈和队列)
3002: 出栈顺序(栈和队列) 时间限制: 1 Sec 内存限制: 128 MB 提交: 80 解决: 20 题目描述 给出一个入栈序列,和一个出栈序列,判断该出栈序列是否正确. 输入 输入包含 ...
- YTU 3006: 迷宫问题(栈与队列)
3006: 迷宫问题(栈与队列) 时间限制: 1 Sec 内存限制: 128 MB 提交: 3 解决: 1 题目描述 编写一个求解迷宫问题的程序,要求输出迷宫的所有路径,并求最短路径长度及最短路径 ...
- SDOTOJ2088 refresh的停车场(栈和队列)
refresh的停车场 Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Submit S ...
- refresh的停车场(栈和队列的STL)
refresh的停车场 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描写叙述 refresh近期发了一笔横財,开了一家停车场. 因 ...
- C++标准模板库STL算法与自适应容器(栈和队列)
参考<21天学通C++>第23与第24章节,对STL算法与自适应容器进行介绍. 实际上在前面的STL顺序容器.关联容器进行介绍时或多或少引用到了一些STL算法中的模板函数.而自适应容器是在 ...
- 算法入门 - 基于动态数组的栈和队列(Java版本)
之前我们学习了动态数组的实现,接下来我们用它来实现两种数据结构--栈和队列.首先,我们先来看一下栈. 什么是栈? 栈是计算机的一种数据结构,它可以临时存储数据.那么它跟数组有何区别呢? 我们知道,在数 ...
- 学习javascript数据结构(一)——栈和队列
前言 只要你不计较得失,人生还有什么不能想法子克服的. 原文地址:学习javascript数据结构(一)--栈和队列 博主博客地址:Damonare的个人博客 几乎所有的编程语言都原生支持数组类型,因 ...
- [ACM训练] 算法初级 之 数据结构 之 栈stack+队列queue (基础+进阶+POJ 1338+2442+1442)
再次面对像栈和队列这样的相当基础的数据结构的学习,应该从多个方面,多维度去学习. 首先,这两个数据结构都是比较常用的,在标准库中都有对应的结构能够直接使用,所以第一个阶段应该是先学习直接来使用,下一个 ...
随机推荐
- set和get的用法
import { Map} from 'immutable'; let a = Map({ select: 'users', filter: Map({ name: 'Cam' }) }) let b ...
- Oracle 内存结构
内存结构 Oracle内存,进程与数据库的图 sga:系统全局区,用来存放操作的数据,库缓存,数据字典等控制信息的内存区域, pga:进程全局区,服务进程专用的内存区域,大多数内容非共享 uga:用 ...
- python3 中 requests 框架
原文的文件地址:http://blog.csdn.net/shanzhizi/article/details/50903748 一.安装 Requests 通过pip安装 pip install re ...
- 2014.12.22 几个有用的oracle正则表达式
SELECT REGEXP_REPLACE('LSS12345', '[^0-9]') FROM DUAL 结果:12345 '[^0-9]'中的^表示‘非’上述表达式的含义是“将LSS12345中的 ...
- 第二章 深入分析Java I/O的工作机制(待续)
Java的I/O类库的基本架构 磁盘I/O工作机制 网络I/O工作机制 NIO的工作方式 I/O调优 设计模式解析之适配器模式 设计模式解析之装饰器模式 适配器模式与装饰器模式的区别
- AngularJS入门之如何快速上手
概述: AngularJS(ng)是一个纯JS框架,AngularJS易于构建CRUD应用(CRUD意思是增删改查) 适用于以数据操作为主的SPA(Single Page Application) ...
- 关于使用字库-雅黑字体(msyh.ttf )显示中文的一些。。。
开发中有关程序在使用字库 雅黑字体的 的时候 vs下一开始没有显示出中文来,都是乱码. 在android下使用该字体库的时候同样也没有显示出中文,后来搜搜了原因,得知编码必须是UTF-8 也就是使用字 ...
- react常见面试题
当你调用 setState 的时候,发生了什么事? 当调用 setState 时,React会做的第一件事情是将传递给 setState 的对象合并到组件的当前状态.这将启动一个称为和解(reconc ...
- windows安装和配置JDK
安装完JDK后配置环境变量 计算机→属性→高级系统设置→高级→环境变量 系统变量→新建 JAVA_HOME 变量 . 变量值填写jdk的安装目录(本人是 E:\Java\jdk1.7.0) ...
- [poj2653]Pick-up sticks
题目大意:给定一系列线段,以及放在平面上的顺序,给出没有被其他覆盖的线段. 解题关键:线段相交的判断. 满足两个条件即可:快速排斥实验.跨立实验. #include<cstdio> #in ...