今天认真的看了队列和栈的初级讲解(《啊哈算法》啊哈磊 著),队列是“头”和“尾”均可进行操作的,用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;
}