队列和栈

今天认真的看了队列和栈的初级讲解(《啊哈算法》啊哈磊 著),队列是“头”和“尾”均可进行操作的,用tail记录队尾的下一个位置,是因为当队列只剩下一个元素时,队尾和队首重合会带来一些麻烦;栈是先入后出的,用于回文数的判断时是将字符串分为两部分,前半部分依次入栈,然后依次出栈与后半部分相对比。

队列:

     有一串错误数字,根据一定规则输出正确数字顺序(规则:将第一个数字删除,紧接着将第二个数字放到这串数字的末尾,第三个数字删除,将四个数字放到这串数字的末尾...直到剩下最后一个数,将最后一个数字也删除,。按照刚才删除的顺序连在一起这就是最终正确的数字顺序。)

#include<stdio.h>
struct queue
{
    int data[100];
    int head;
    int tail;
};
int main()
{
    struct queue q;
    int i;//初始化队列
    q.head=1;//此处是我习惯性的从1开始记录
    q.tail=1;//队列中已经有9个元素,tail指向队尾的后一个位置
    for(i=1;i<=9;i++)
    {
        scanf("%d",&q.data[q.tail]);//6 3 1 7 5 8 9 2 4
        q.tail++;
    }
    while(q.head<q.tail)//队列不为空的时候执行循环
    {
        //打印队首并将队首出队
        printf("%d ",q.data[q.head]);
        q.head++;    
        
        //先将新队首的数添加到队尾
        q.data[q.tail]=q.data[q.head];
        q.tail++;
        
        //再将队首出队
        q.head++ ;
    }
    getchar();
    getchar();
    return 0;
 }

栈:

    解密回文

#include<stdio.h>
#include<string.h>
 
int main()
{
    char a[101],s[101];
    int i,len,mid,next,top;
    
    gets(a);//读入一行字符串
    len=strlen(a);
    mid=len/2-1;// 字符串中点
    
    top=0;//栈初始化
    
    //将mid前的字符依次入栈
    for(i=0;i<=mid;i++)
    {
        s[++top]=a[i];
        
    }
    
    
    //判断字符串的长度是奇数还是偶数,并找出需要进行匹配的起始下标
    if(len%2==0)
        next=mid+1;
    else
        next=mid+2;
    
    //开始匹配
    for(i=next;i<len;i++)
    {
        if(a[i]!=s[top])
            break;
        top--;
     }
    
     //如果top的值为0,则说明栈内所有的字符都一一被匹配了
     if(top==0)
         printf("YES");
    else
        printf("NO");
    
    getchar();
    getchar();
    return 0;
    return 0;
 }

 

//栈

#include<stdio.h>
#include<algorithm>
using namespace std;
#include<stack>//stack库
int main()
{
    int count;
    stack<int>s;//栈名为s
    s.push(8)//入栈
    s.push(9);
    count=s.size();//栈中元素个数
    printf("%d\n",count);
    while(!s.empty())
    {
        printf("%d\n",s.top());//返回栈顶元素
        s.pop();//弹出栈顶元素
    }
    return 0;
}

//出栈入栈的过程

#include<stdio.h>
#define MaxSize 20

typedef struct
{
    int Data[MaxSize];   // 存储元素的数组
    int topIdx;       //栈顶指针
}SeqStack;
//初始化栈
void InitStack(SeqStack &S)
{
    S.topIdx = -1;
}
//入栈
int push(SeqStack &L,int e)
{
    if(L.topIdx==MaxSize-1)
        return 0;
    L.Data[L.topIdx++]=e;
    return e;
}
//出栈
int pop(SeqStack &L,int m)
{
    if(L.topIdx==0)
        return 0;
    m=L.Data[--L.topIdx];
    printf("%d ",m);
    return m;
}

int main()
{
    SeqStack s;
    InitStack(s);
    push(s,3);
    push(s,5);
    push(s,9);
    pop(s,3); //表示第三个元素出栈
    return 0;
}

 

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值