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


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. git revert reset

    git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit. git reset 是把HEAD向后移动了一下,而git revert是HEAD ...

  2. linux user date

    useradd username 添加用户 userdel username 删除用户 passwd username 设置用户密码 passwd 设置当前用户密码 passwd -d usernam ...

  3. C# 单例模式代码

    原文地址:http://blog.jobbole.com/101746/ 代码一: public sealed class Singleton     {         static Singlet ...

  4. Java基础--序列化Serializable

    对Java对象序列化的目的是持久化对象或者为RMI(远程方法调用)传递参数和返回值. 下面是一个序列化对象写入文件的例子: ---------------------------- package u ...

  5. 几种排序方式的java实现(01:插入排序,冒泡排序,选择排序,快速排序)

    以下为集中排序的java代码实现(部分是在引用别人代码): 插入排序(InsertSort): //代码原理 public static void iSort(int[] a){ for(int i ...

  6. rails登录后跳转到登录前的路径

    # 重定向到存储的地址或默认地址 def redirect_back_or(default) redirect_to(session[:forwarding_url] || default) sess ...

  7. Python函数(四)-递归函数

    递归函数就是函数在自己内部调用自己 # -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" def Digui(n): print(n ...

  8. Ubuntu下设置VNCServer

    Ubuntu下设置VNCServer Virtual Network Computing(VNC)是进行远程桌面控制的一个软件.客户端的键盘输入和鼠标操作通过网络传输到远程服务器,控制服务器的操作.服 ...

  9. CSS——常用

    1.超链接样式 a:link {color: #FF0000}  /* 未访问的链接 */a:visited {color: #00FF00} /* 已访问的链接 */a:hover {color: ...

  10. 问题:Custom tool error: Failed to generate code for the service reference 'AppVot;结果:添加Service Reference, 无法为服务生成代码错误的解决办法

    添加Service Reference, 无法为服务生成代码错误的解决办法 我的解决方案是Silverlight+WCF的应用,Done Cretiria定义了需要在做完Service端的代码后首先运 ...