重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
如何使用java代码实现栈和队列
创新互联建站专注于秦安网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供秦安营销型网站建设,秦安网站制作、秦安网页设计、秦安网站官网定制、小程序定制开发服务,打造秦安网络公司原创品牌,更为您提供秦安网站排名全网营销落地服务。
import java.util.Scanner;
import java.util.Stack;
/**
* @author Owner
*
*/
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n= sc.nextInt();//3条测试数据数据
StackCharacter stack = null;
while(n!=0){
//从控制台读入一个测试字符串[]() [(])
String str = sc.next();
//如果该输入字符串为奇数,说明不匹配
if(str.length() % 2 == 1){
System.out.println("No");
}else{
//说明字符是偶数
stack = new StackCharacter();
//遍历第一条测试字符串[]() [(])
for(int i=0;istr.length();i++){
if(stack.isEmpty()){
//如果栈是空的
stack.push(str.charAt(i));
}else if(stack.peek() == '[' str.charAt(i) == ']' || stack.peek() == '(' str.charAt(i) == ')'){
//说明此时栈中字符不是空的,并且符合,
stack.pop();
}else{
stack.push(str.charAt(i));
}
}
if(stack.isEmpty()){
//如果栈是空的,说明a href=";tn=44039180_cprfenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1Y3mhDvP10Ln19hrANbP1fk0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3ErHnLP1nsPHDznHTkn1fYPHnz" target="_blank" class="baidu-highlight"括号/a匹配
System.out.println("Yes");
}else{
//说明栈不为空,a href=";tn=44039180_cprfenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1Y3mhDvP10Ln19hrANbP1fk0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3ErHnLP1nsPHDznHTkn1fYPHnz" target="_blank" class="baidu-highlight"括号/a不匹配
System.out.println("No");
}
}
n--;
}
}
}
public class Stack {
private Object[] stack;
//这个不需要;
//private int top = 0; //初始化栈顶
//这个也不需要;
//写一个栈出来,最好是可以动态的,可以自己改变大小的,即数组的长度;
//private int size = 0; // 初始化大小
//元素个数;
private int size;
//默认长度为10;
public Stack(){
this(10);
}
//也可以自己设置长度,即容量;
public Stack(int len){
stack = new Object[len];
}
//返回元素个数;
public int size(){
return size;
}
//返回数组长度,即容量;
public int capacity(){
return stack.length;
}
//实现动态的数组;
public void ensureCapacity(){
if(size() == capacity()){
Object[] newStack = new Object[size() * 3 / 2 + 1];
System.arraycopy(stack, 0, newStack, 0, size());
stack = newStack;
}
}
//入栈;
public void push(Object o){
size++;
ensureCapacity();
stack[size - 1] = o;
}
/*
public void push(Object object) {
if (isFull()) {
System.out.println("栈满! 入栈失败");
}
stack[top++] = object;
}
*/
//判空;
public boolean isEmpty(){
return size == 0;
}
//出栈;
public Object pop(){
//首先要判空;
if(isEmpty()){
throw new ArrayIndexOutOfBoundsException("不能为空");
}
Object o = stack[--size];
stack[size] = null;
return o;
}
/*
// 出栈
public Object pop() {
Object object = stack[--top];
stack[top] = null;
return object;
}
*/
/*
// 计算栈当前大小
public int size() {
return top;
}
// 判断是否是空栈
public boolean isEmpey() {
return top == 0;
}
// 判断是否栈满
public boolean isFull() {
return top = size;
}
public Stack(int size) {
this.size = size;
}
*/
public static void main(String[] args) {
Stack stack = new Stack(3);
String[] data = new String[] { "a", "b", "c" };
for (int i = 0; i data.length; i++) {
stack.push(data[i]);
System.out.println(data[i] + "");
}
System.out.println("***********");
while (!stack.isEmpty()) {
System.out.println(stack.pop() + "");
}
//}
}
}
你自己对比一下,我是在你的里面修改的
看到这道题目想到了三个方法,依次给你列出(栈的方式,递归,数组)
栈的方式:
//思路:将十进制数(number)除以R取余,让取得的余数(number Mod R )进栈,让十进制数变为
number/R,重复上述过程,直到number等于0为止,然后依次从栈中取出数据即为所求,直到栈为空,下面是实现的代码:
#includestdio.h
#includestdlib.h
#define MAX_SIZE 80
typedef struct
{//栈的数据结构,采用数组
char data[MAX_SIZE];
int top;
}stack;
int isfull(stack s)
{//判断栈是否已满
return (++s.top==MAX_SIZE);
}
int isempty(stack s)
{//判断栈为空
return s.top==-1;
}
void push(stack * s,char in_data)
{//进栈
if(isfull(*s))
{
printf("栈已满,不能执行操作!\n");
exit(1);
}
s-data[++s-top]=in_data;
}
void pop(stack *s)
{//出栈
if(isempty(*s))
{
printf("栈已空,不能执行操作!\n");
exit(1);
}
s-top--;
}
char top_value(stack *s)
{//取栈顶元素
if(isempty(*s))
{
printf("栈已空,不能执行操作!\n");
exit(1);
}
return s-data[s-top];
}
int main(int argc,char** argv)
{
int number;
stack result;
result.top=-1;
int r_range;
printf("输入转换的数据和对应的进制:");
scanf("%d%d",number,r_range);
printf("%d对应的%d进制为:",number,r_range);
while(number!=0)
{
char input;
if(number%r_range=10)
input=((number%r_range)-10)+'a';
else
input=((number%r_range)+'0');
push(result,input);
number=number/r_range;
}
while(!isempty(result))
{
putchar(top_value(result));
pop(result);
}
return 0;
}
====================================================================
递归的方式:定义一个输出字符串,让十进制数(number)除以要转换的进制R 若结果不为0,则继续执行前述操作,直到得到除的结果为零,此时number除以R取其余数,将其结果(number Mod R)映射到指定的输出字符数组中下标输出即为结果(描述的不是很好,你看代码吧)
//用这种方法也比较可以
#includestdio.h
void ten_to_any(int number,int range_t)
{//递归实现
char text[]="0123456789abcdef";
int k=number/range_t;
if(k)
ten_to_any(k,range_t);
putchar(text[number%range_t]);
}
int main()
{
int number,r_range;
while(1)
{
printf("\n输入转换的数据,和对应进制:");
scanf("%d%d",number,r_range);
if(r_range16||r_range2)
{
printf("超出了范围!");
break;
}
printf("%d对应的%d进制为:",number,r_range);
ten_to_any(number,r_range);
}
return 0;
}
//采用数组的形式
这是我上次回答别人的
用一个字符串保存转换的结果(str[80])假设十进制数为number,转换的进制为digits,则将numbers%digits(根据余数的情况做相应处理)结果保存在字符串str中,将numbers变为numbers/digits;直到numbers为零。得到的结果为逆序,需要将其倒转,倒转后即为所求。
//-----------c语言实现10进制转2~16进制
#includestdio.h
#includestring.h
void TentoAny(int number,char *str,int digits)
{
int i=0;
if(digits16||digits2)//非2~16进制则直接退出
return ;
while(number)
{
if(number%digits=10)
{
str[i++]='A'+(number%digits-10);
}
else
{
str[i++]=number%digits+'0';
}
}
str[i]='\0';
strrev(str);//strrev函数定义在string.h中的,是对字符串做逆序处理的函数
//这里需要逆序的原因是因为得到的结果为该进制的逆序
}
使用java.util包中的Stack类创建一个栈对象
public Object push(Object data);输入数据,实现压栈
public Object pop();输出数据,实现弹栈
public boolean empty()判空
public Object peek();查看栈顶元素
可以去查查API嘛
我也是学java的,大家一起进步。