首页 > 其他分享 >顺序栈实现进制转换 和 通过键盘输入一个包括 '(' 和 ')' 的字符串string ,判断字符串是否有效

顺序栈实现进制转换 和 通过键盘输入一个包括 '(' 和 ')' 的字符串string ,判断字符串是否有效

时间:2024-05-06 23:14:20浏览次数:19  
标签:SeqStack return string int Top 键盘输入 Manager 顺序 字符串

/********************************************************************************************************
*
*	file name:	Zqh_栈实现.c
* 	author	 :	[email protected]
* 	date	 :	2024/05/05
* 	function :	顺序栈实现进制转换 和 通过键盘输入一个包括  '(' 和 ')' 的字符串string ,判断字符串是否有效	
*	note	 :	考研题
*	
*  Copyright (c)  2023-2024   [email protected]    All right Reserved
* ******************************************************************************************************/

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>




//指的是顺序栈中的元素的数据类型,用户可以根据需要进行修改
typedef int  DataType_t;

//构造记录顺序栈SequenceStack各项参数(栈底地址+栈容量+栈顶元素的下标)的结构体
typedef struct SequenceStack
{
	DataType_t * Bottom;		//记录栈底地址
	unsigned int Size;			//记录栈容量
	int			 Top;      		//记录栈顶元素的下标	

}SeqStack_t;


//创建顺序表并对顺序栈进行初始化
SeqStack_t * SeqStack_Create(unsigned int size)
{
	//1.利用calloc为顺序栈的管理结构体申请一块堆内存
	SeqStack_t *Manager = (SeqStack_t *)calloc(1,sizeof(SeqStack_t));

	if(NULL == Manager)
	{
		perror("calloc memory for manager is failed");
		exit(-1); //程序异常终止
	}

	//2.利用calloc为所有元素申请堆内存
	Manager->Bottom = (DataType_t *)calloc(size,sizeof(DataType_t));

	if (NULL == Manager->Bottom)
	{
		perror("calloc memory for Stack is failed");
		free(Manager);
		exit(-1); //程序异常终止
	}

	//3.对管理顺序栈的结构体进行初始化(元素容量 + 最后元素下标)
	Manager->Size = size;	//对顺序栈中的容量进行初始化
	Manager->Top = -1;		//由于顺序栈为空,则栈顶元素的下标初值为-1
	
	return Manager;
}


//判断顺序栈是否已满
bool SeqStack_IsFull(SeqStack_t *Manager)
{
	return (Manager->Top + 1 == Manager->Size) ? true : false;
}


//入栈
bool SeqStack_Push(SeqStack_t *Manager, DataType_t Data)
{
	//1.判断顺序栈是否已满
	if ( SeqStack_IsFull(Manager) )
	{
		printf("SeqStack Full is Full!\n");
		return false;
	}

	//2.如果顺序栈有空闲空间,则把新元素添加到顺序栈的栈顶
	Manager->Bottom[++Manager->Top] = Data;

	return true;
}





//判断顺序栈是否为空
bool SeqStack_IsEmpty(SeqStack_t *Manager)
{
	return (-1 == Manager->Top) ? true : false;
}



//出栈
DataType_t SeqStack_Pop(SeqStack_t *Manager)
{
	DataType_t temp = 0;  //用于存储出栈元素的值

	//1.判断顺序栈是否为空
	if ( SeqStack_IsEmpty(Manager) )
	{
		printf("SeqStack is Empty!\n");
		return;
	}
	
	//2.由于删除了一个元素,则需要让顺序栈的栈顶元素下标-1
	temp = Manager->Bottom[Manager->Top--];

	return temp;
}


//遍历顺序表的元素
void SeqStack_Print(SeqStack_t *Manager)
{
	for (int i = 0; i <= Manager->Top; ++i)
	{
		printf(" Stack Element[%d] = %d\n",i,Manager->Bottom[i]);
	}
}

//十进制转换为十六进制
void SeqStack_Dec2Hex(SeqStack_t *Manager,unsigned int Data)   
{
	int remainder; //用于存储求余之后的余数


	//1.循环对非负整数进行求余  Data % 16 
	do
	{
		remainder = Data % 16;

		 //分析余数的范围 0~9  10~15 -->A~F
		if (remainder < 10)
		{
		 	SeqStack_Push(Manager,remainder+'0');
		}
		else
		{
			SeqStack_Push(Manager,remainder+'A'-10);
		}

		Data /= 16;

	}while(Data != 0);

	//2.把顺序栈中的元素依次出栈
	printf("0x");
	while( !SeqStack_IsEmpty(Manager) )
	{	
		printf("%c", SeqStack_Pop(Manager) );
	}
	printf("\n");
}


// ")hel()()loworl(()d"
bool SeqStack_IsStringVaild(SeqStack_t *Manager,const char *Str)
{
	char *Pstr = Str; //备份地址,防止地址丢失

	//1.循环遍历字符串,寻找'(' 
	while( *Pstr )
	{
		//判断当前地址下的字符是否为'(',如果是则入栈
		if (*Pstr == '(')
		{
			SeqStack_Push(Manager,'(');	
		}
		if( *Pstr == ')' )
		{
			//判断空栈
			if(SeqStack_IsEmpty(Manager))
			{
				return false;
			}

			SeqStack_Pop(Manager);
		}

		Pstr++;
	}

	//2.判断栈是否为空
	if(!SeqStack_IsEmpty(Manager))
	{
		return false;		
	}

	return true;
}


int main(int argc, char const *argv[])
{

	
	return 0;
}


标签:SeqStack,return,string,int,Top,键盘输入,Manager,顺序,字符串
From: https://www.cnblogs.com/kencszqh/p/18176159

相关文章

  • 删除字符串A与字符串B相同的字符
    /***filename:DelDestChar.c*author:[email protected]*date:2024-05-06*function:DeletestringAaliketostringB'scharactor*note:None*CopyRight(c)[email protected]***/#include<std......
  • 字符串Str函数小结
    数据结构字符串Str函数总结·我们学习过很多关于求解字符串相关问题的函数,但是都是每遇到一次算认识了,一定程度上很少进行总结,最近又重新接触到了这类“Str函数”,发现自己还是有点掌握不牢固,以下仅是个人学习总结,有错误之处可指出。如上图所示,在man手册中有许多关于str的函数,......
  • 对字符串A进行处理,参照字符串B,只有字符串B中的字母在字符串A存在,则不分大小写,从字符串
    /**@filename: main.c@brief实现对字符串A进行处理,参照字符串B,只有字符串B中的字母在字符串A存在,则不分大小写,从字符串A中删除@[email protected]@date2024/06/[email protected]:版本@property:属性介绍@note补充注意说明CopyRight(c)2023-2024RISE......
  • 删除字符串中与另一个字符串中的相同字母的自定义函数
    #include<stdio.h>/********************************************************************* 函数名称: str_DestDel* 函数功能:删除一个字符串中与另一个字符串中的相同字母并且不区分大小写* 函数参数:* @strA 需要操作的字符串* @strB 作为参考的字......
  • 0506C语言练习:字符串A中删除字符串B中所有相同字母等
    字符串A中删除字符串B中所有相同字母(无论大小写)/***@func: 字符串A中删除字符串B中所有相同字母(无论大小写)*@date2024/05/06*@version1.0:版本*CopyRight(c)[email protected]*/voidrepeat(char*a,constchar*b){......
  • 删除A字符串中B字符串有的字符
    char*DelStrAofStrB(char*strA,char*strB){//判断字符串B是否到尾部while(*strB!='\0'){//判断字符串B的当前字符是否属于字母(不论大小写)if((*strB<'A'||*strB>'Z')&&(*strB<'a'||*str......
  • 用php找出字符串中连续重复次数最多的字符,你有方法吗?
     找出字符串中连续重复次数最多的字符,这里总结了几种方法,不管是在开发中,还是在面试中都会遇到。方法一<?php$arr=str_split($str);//字符串分隔到数组中$arr=array_count_values($arr);//用于统计数组中所有值出现的次数,返回一个数组//键名为原数组的键值,键值为......
  • ABC240Ex Sequence of Substrings
    ABC240ExSequenceofSubstringsLIS的好题改编。约定\(S(l,r)\)为字符串\(s\)中第\(l\)位到底\(r\)​位。\(S(l,r)<S(x,y)\)为字符串中\([l,r]\)的子串字典序比\([x,y]\)的子串小。前置LIS的\(n\logn\)求法。题解我们考虑按照类似于朴素LIS的方式设状......
  • 数据类型之字符串
    1、字符串的定义单引号,双引号引起来的2、字符串的索引和切片和转义2.1索引:1.索引值从0开始索引超长会报错IndexError:stringindexoutofrange2.写法:str[0]2.2切片:1.[起始下标:终止下标:步长]:起始下标默认为0,步长默认为12.取头不取尾,左开右闭3.步长为正数,正......
  • [leetcode 87 扰乱字符串] [剪枝搜索]
    importjava.util.HashMap;importjava.util.Map;classSolution{publicstaticvoidmain(String[]args){Solutionsolution=newSolution();booleanres=solution.isScramble("eebaacbcbcadaaedceaaacadccd","eadcaacabad......