栈
栈(stack) 是限定仅在表尾进行插入和删除操作的线性表。
我们把允许插入和删除的一端称为栈顶(top) ,另一端称为栈底(bottom) ,不含任何数据元素的称为空栈。栈又称为后进先出(Last In First out)的线性表,简称LIFO结构。
栈的特殊之处就在于限制这个线性表的插入和删除位置,它始终只在栈顶进行。这就使得:栈底是固定的,最先进栈的只能在栈底。
栈的插入操作,叫做进栈,也称压栈、入栈。类似于子弹入弹夹。(push)
栈的删除操作,叫做出栈,有的也叫弹栈。(pop)
//算法中模拟栈使用模板
3. 栈
// tt表示栈顶
int stk[N], tt = 0;
// 向栈顶插入一个数
stk[ ++ tt] = x;
// 从栈顶弹出一个数
tt -- ;
// 栈顶的值
stk[tt];
// 判断栈是否为空
if (tt > 0)
{
}
java代码演示
package 栈;
import java.util.Scanner;
public class stack {
public static void main(String[] args) {
boolean c;
Scanner in=new Scanner(System.in);
StringStack stack1=new StringStack();
while(true)
{
int x,y,i;
System.out.println("1.进栈");
System.out.println("2.出站");
System.out.println("3.栈顶元素");
System.out.println("4.栈是否为空");
System.out.println("请选择:");
x=in.nextInt();
switch(x) {
case 1:
System.out.println("输入栈的长度");
y=in.nextInt();
System.out.println("输入进栈元素");
for(i=0;i<y;i++)
{
String input=in.next();
stack1.push(input);
}
break;
case 2:
if(stack1.isEmpty())
{
System.out.println("此栈为空");
}
else while(!stack1.isEmpty())
{
System.out.println(stack1.pop()+"");
}
System.out.println();
break;
case 3:
c=stack1.isEmpty();
if(c==true)
{
System.out.println("栈为空");
}
else
System.out.println(stack1.top());
break;
case 4:
c=stack1.isEmpty();
if(c==true)
{
System.out.println("栈为空");
}
else
{
System.out.println("栈不为空");
}
break;
default:
System.out.println("输入信息有误");
}
}
}
}
算法题:
DFS
n 皇后(来源acwing )
#include<iostream>
using namespace std;
const int N=100;
int n;
char g[N][N];
bool col[N],dg[N],udg[N];
// col[]里面保存的是当前列元素
// dg[] 和udg[]里面保存的对角线和反对角线元素
//U就相当于坐标中的x (x,y)---(u,i)
void dfs(int u){
if(u==n){
for(int i=0;i<n;i++) puts(g[i]);
cout<<endl;
return;
}
for(int i=0;i<n;i++)
if(!col[i]&&!dg[u+i]&&!udg[n-u+i]){
g[u][i]='Q';
col[i]=dg[u+i]=udg[n-u+i]=true;
dfs(u+1);
col[i]=dg[u+i]=udg[n-u+i]=false;
g[u][i]='.';
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
g[i][j]='.';
dfs(0);
return 0;
}