数值转换
#pragma warning(disable:4996)
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
using namespace std;
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define ERROR 0
#define OK 1
#define TRUE 1
#define FALSE 0
typedef int SElemType;
typedef int Status;
typedef struct {
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
Status InitStack(SqStack &S);
Status DestroyStack(SqStack &S);
Status ClearStack(SqStack &S);
Status StackEmpty(SqStack S);
int StackLength(SqStack S);
Status GetTop(SqStack S, SElemType &e);
Status Push(SqStack &S, SElemType e);
Status Pop(SqStack &S, SElemType &e);
Status StackTraverse(SqStack S, Status(*visit)());
Status InitStack(SqStack &S) {
S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(char));
if (!S.base) exit(OVERFLOW);
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}
Status DestroyStack(SqStack &S){
if(S.base ){
free(S.base);
S.base = NULL;
S.top = NULL;
S.stacksize = 0;
}
return OK;
}
Status ClearStack(SqStack &S){
if(S.base){
S.top = S.base;
}
return OK;
}
Status StackEmpty(SqStack S) {
if (S.top == S.base) return OK;
else return ERROR;
}
int StackLength(SqStack S)
{
return (S.top-S.base)/sizeof(SElemType);
}
Status GetTop(SqStack S, SElemType &e) {
if (S.top == S.base) return ERROR;
e = *(S.top - 1);
return OK;
}
Status Push(SqStack &S, SElemType e) {
if (S.top - S.base >= S.stacksize) {
S.base = (SElemType*)realloc(S.base,
(S.stacksize + STACKINCREMENT) * sizeof(char));
if (!S.base) exit(OVERFLOW);
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*(S.top++) = e;
return OK;
}
Status Pop(SqStack &S, SElemType &e) {
if (S.top == S.base) return ERROR;
e = *(--S.top);
return OK;
}
Status StackTraverse(SqStack S, Status(* visit)(SElemType)){
while(S.top > S.base)
visit(*S.base++);
printf("\n");
return OK;
}
Status visit(SElemType e){
printf("%c ", e);
return OK;
}
void PrintStack(SqStack s) {
if (StackEmpty(s)) return;
printf("Stack:");
while (!StackEmpty(s)){
printf("%c ", *(s.top - 1));
SElemType e;
Pop(s, e);
}
printf("\n");
}
void conversion(){
SqStack S;
InitStack(S);
SElemType e;
int n, r;
printf("输入一个数十进制数和想要转换的进制:\n");
scanf("%d %d", &n, &r);
while(n){
Push(S, n%r);
n/=r;
}
while(!StackEmpty(S)){
Pop(S,e);
printf("%d", e);
}
printf("\n");
}
int main() {
conversion();
return 0;
}
1348 8
2504
括号匹配
#pragma warning(disable:4996)
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
using namespace std;
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define ERROR 0
#define OK 1
#define TRUE 1
#define FALSE 0
typedef char SElemType;
typedef char Status;
typedef struct {
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
Status InitStack(SqStack &S);
Status DestroyStack(SqStack &S);
Status ClearStack(SqStack &S);
Status StackEmpty(SqStack S);
int StackLength(SqStack S);
Status GetTop(SqStack S, SElemType &e);
Status Push(SqStack &S, SElemType e);
Status Pop(SqStack &S, SElemType &e);
Status StackTraverse(SqStack S, Status(*visit)());
Status InitStack(SqStack &S) {
S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(char));
if (!S.base) exit(OVERFLOW);
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}
Status DestroyStack(SqStack &S){
if(S.base ){
free(S.base);
S.base = NULL;
S.top = NULL;
S.stacksize = 0;
}
return OK;
}
Status ClearStack(SqStack &S){
if(S.base){
S.top = S.base;
}
return OK;
}
Status StackEmpty(SqStack S) {
if (S.top == S.base) return OK;
else return ERROR;
}
int StackLength(SqStack S)
{
return (S.top-S.base)/sizeof(SElemType);
}
Status GetTop(SqStack S, SElemType &e) {
if (S.top == S.base) return ERROR;
e = *(S.top - 1);
return OK;
}
Status Push(SqStack &S, SElemType e) {
if (S.top - S.base >= S.stacksize) {
S.base = (SElemType*)realloc(S.base,
(S.stacksize + STACKINCREMENT) * sizeof(char));
if (!S.base) exit(OVERFLOW);
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*(S.top++) = e;
return OK;
}
Status Pop(SqStack &S, SElemType &e) {
if (S.top == S.base) return ERROR;
e = *(--S.top);
return OK;
}
Status StackTraverse(SqStack S, Status(* visit)(SElemType)){
while(S.top > S.base)
visit(*S.base++);
printf("\n");
return OK;
}
Status visit(SElemType e){
printf("%c ", e);
return OK;
}
void PrintStack(SqStack s) {
if (StackEmpty(s)) return;
printf("Stack:");
while (!StackEmpty(s)){
printf("%c ", *(s.top - 1));
SElemType e;
Pop(s, e);
}
printf("\n");
}
void matchStr(){
SqStack s;
SElemType ch[80], *p, e;
if(InitStack(s)){
printf("请输入表达式:\n");
gets(ch);
p=ch;
while(*p){
switch(*p){
case '(':
case '[':
case '{':
Push(s,*p++);
break;
case ')':
case ']':
case '}':
if(!StackEmpty(s)) {
Pop(s,e);
if((*p==')' && e!='(' )|| (*p==']'&& e!='[') ||(*p=='}' && e!='{')){
printf("左右括号不配对,匹配失败!\n");
exit(ERROR);
}
else p++;
} else {
printf("缺乏左括号,匹配失败!\n");
exit(ERROR);
}
break;
default:
p++;
}
}
if(StackEmpty(s))
printf("括号匹配成功!\n");
else
printf("缺乏右括号,匹配失败!\n");
}
}
int main() {
matchStr();
return 0;
}
()[{458(0-{}[])}]
行编辑程序
#pragma warning(disable:4996)
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
using namespace std;
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define ERROR 0
#define OK 1
#define TRUE 1
#define FALSE 0
typedef char SElemType;
typedef char Status;
typedef struct {
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
Status InitStack(SqStack &S);
Status DestroyStack(SqStack &S);
Status ClearStack(SqStack &S);
Status StackEmpty(SqStack S);
int StackLength(SqStack S);
Status GetTop(SqStack S, SElemType &e);
Status Push(SqStack &S, SElemType e);
Status Pop(SqStack &S, SElemType &e);
Status StackTraverse(SqStack S, Status(*visit)());
Status InitStack(SqStack &S) {
S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(char));
if (!S.base) exit(OVERFLOW);
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}
Status DestroyStack(SqStack &S){
if(S.base ){
free(S.base);
S.base = NULL;
S.top = NULL;
S.stacksize = 0;
}
return OK;
}
Status ClearStack(SqStack &S){
if(S.base){
S.top = S.base;
}
return OK;
}
Status StackEmpty(SqStack S) {
if (S.top == S.base) return OK;
else return ERROR;
}
int StackLength(SqStack S)
{
return (S.top-S.base)/sizeof(SElemType);
}
Status GetTop(SqStack S, SElemType &e) {
if (S.top == S.base) return ERROR;
e = *(S.top - 1);
return OK;
}
Status Push(SqStack &S, SElemType e) {
if (S.top - S.base >= S.stacksize) {
S.base = (SElemType*)realloc(S.base,
(S.stacksize + STACKINCREMENT) * sizeof(char));
if (!S.base) exit(OVERFLOW);
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*(S.top++) = e;
return OK;
}
Status Pop(SqStack &S, SElemType &e) {
if (S.top == S.base) return ERROR;
e = *(--S.top);
return OK;
}
Status StackTraverse(SqStack S, Status(* visit)(SElemType)){
while(S.top > S.base)
visit(*S.base++);
printf("\n");
return OK;
}
Status visit(SElemType e){
printf("%c ", e);
return OK;
}
void PrintStack(SqStack s) {
if (StackEmpty(s)) return;
printf("Stack:");
while (!StackEmpty(s)){
printf("%c ", *(s.top - 1));
SElemType e;
Pop(s, e);
}
printf("\n");
}
void LineEdit(){
SqStack S;
InitStack(S);
SElemType ch,c;
while((ch=getchar())!=EOF){
while(ch!=EOF && ch!='\n'){
switch(ch){
case '#':
Pop(S, c);
break;
case '@':
ClearStack(S);
break;
default:
Push(S, ch);
break;
}
ch=getchar();
}
StackTraverse(S, visit);
ClearStack(S);
if(ch!=EOF) ch=getchar();
}
DestroyStack(S);
}
int main() {
LineEdit();
return 0;
}
whli##ilr#e(a#*s)
outcha@putchar(*s=#++)
表达式转换
#pragma warning(disable:4996)
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
using namespace std;
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define ERROR 0
#define OK 1
#define TRUE 1
#define FALSE 0
typedef int SElemType;
typedef int Status;
typedef struct {
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
Status InitStack(SqStack &S);
Status DestroyStack(SqStack &S);
Status ClearStack(SqStack &S);
Status StackEmpty(SqStack S);
int StackLength(SqStack S);
Status GetTop(SqStack S, SElemType &e);
Status Push(SqStack &S, SElemType e);
Status Pop(SqStack &S, SElemType &e);
Status StackTraverse(SqStack S, Status(*visit)());
Status InitStack(SqStack &S) {
S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(char));
if (!S.base) exit(OVERFLOW);
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}
Status DestroyStack(SqStack &S){
if(S.base ){
free(S.base);
S.base = NULL;
S.top = NULL;
S.stacksize = 0;
}
return OK;
}
Status ClearStack(SqStack &S){
if(S.base){
S.top = S.base;
}
return OK;
}
Status StackEmpty(SqStack S) {
if (S.top == S.base) return OK;
else return ERROR;
}
int StackLength(SqStack S)
{
return (S.top-S.base)/sizeof(SElemType);
}
Status GetTop(SqStack S, SElemType &e) {
if (S.top == S.base) return ERROR;
e = *(S.top - 1);
return OK;
}
Status Push(SqStack &S, SElemType e) {
if (S.top - S.base >= S.stacksize) {
S.base = (SElemType*)realloc(S.base,
(S.stacksize + STACKINCREMENT) * sizeof(char));
if (!S.base) exit(OVERFLOW);
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*(S.top++) = e;
return OK;
}
Status Pop(SqStack &S, SElemType &e) {
if (S.top == S.base) return ERROR;
e = *(--S.top);
return OK;
}
Status StackTraverse(SqStack S, Status(* visit)(SElemType)){
while(S.top > S.base)
visit(*S.base++);
printf("\n");
return OK;
}
Status visit(SElemType e){
printf("%c ", e);
return OK;
}
void PrintStack(SqStack s) {
if (StackEmpty(s)) return;
printf("Stack:");
while (!StackEmpty(s)){
printf("%c ", *(s.top - 1));
SElemType e;
Pop(s, e);
}
printf("\n");
}
int EvaluateExpression();
char OP[7] = {'+', '-', '*', '/', '(', ')','#'};
int main(){
printf("Expression = %d\n",EvaluateExpression());
return 0;
}
Status In(char c, char* OP){
for(unsigned int i = 0 ; i < strlen(OP); ++i){
if(*(OP + i) == c) return TRUE;
}
return FALSE;
}
char Precede(char a, char b){
int i,j;
char pre[][7]={
{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=',' '},
{'>','>','>','>',' ','>','>'},
{'<','<','<','<','<',' ','='}};
switch(a){
case '+': i = 0; break;
case '-': i = 1; break;
case '*': i = 2; break;
case '/': i = 3; break;
case '(': i = 4; break;
case ')': i = 5; break;
case '#': i = 6; break;
}
switch(b){
case '+': j = 0; break;
case '-': j = 1; break;
case '*': j = 2; break;
case '/': j = 3; break;
case '(': j = 4; break;
case ')': j = 5; break;
case '#': j = 6; break;
}
return pre[i][j];
}
int Operate(int a, char op, int b){
int result;
switch(op){
case '+': result = a + b; break;
case '-': result = a - b; break;
case '*': result = a * b; break;
case '/': result = a / b; break;
}
return result;
}
char getcharwithoutspace(){
char c;
while((c=getchar())==' ');
return c;
}
int EvaluateExpression(){
SqStack OPND;
SqStack OPTR;
InitStack(OPTR);
InitStack(OPND);
Push(OPTR, '#');
char c = getcharwithoutspace();
SElemType e;
GetTop(OPTR, e);
while((c != '#') || (e != '#')){
if(!In(c, OP)){
int n = 0;
do{
n = n * 10 + (c - '0');
c = getcharwithoutspace();
}while(!In(c, OP));
Push(OPND, n);
}else{
GetTop(OPTR, e);
switch(Precede(e, c)){
case '<':
Push(OPTR, c);
c = getcharwithoutspace();
break;
case '=':
Pop(OPTR, e);
c = getcharwithoutspace();
break;
case '>':
SElemType theta;
int b, a;
Pop(OPTR, theta);
Pop(OPND, b);
Pop(OPND, a);
Push(OPND, Operate(a, theta, b));
break;
}
}
GetTop(OPTR, e);
}
int result;
GetTop(OPND, result);
return result;
}
4+2*3-10/5#
Expression = 8